C#에서 가장 긴 공통 접두사 찾기 | Dotnet Office

공통 접두사를 찾는 방법에 대한 코드를 제시합니다. 좀 더 간단한 방법이 있을 듯 한데요?


1개의 좋아요

뭐 이런 느낌으로도 되겠군요.

string[] input = { "flower", "flight", "fly", "flow" };
string result = LongestCommonPrefixFun(input);
Console.WriteLine("Longest Common Prefix is- " + result); // Output: "fl"

static string LongestCommonPrefixFun(string[] input)
{
    if (input.Length is 0)
        return string.Empty;

    var minLength = input.Min(x => x.Length);
    for (var i = 0; i < minLength; i++)
    {
        if (input.Select(x => x[i]).Any(x => x != input[0][i]) is true)
            return input[0][..i];
    }

    return input[0][..minLength];
}
1개의 좋아요

오, ChatGPT도 나름 짜주네요.

| ChatGPT (Mar 23 Version)

static string LongestCommonPrefix(string[] input)
{
    if (input == null || input.Length == 0)
        return string.Empty;

    var minLength = input.Min(x => x.Length);
    if (minLength == 0)
        return string.Empty;

    for (var i = 0; i < minLength; i++)
    {
        var currentChar = input[0][i];
        for (var j = 1; j < input.Length; j++)
        {
            if (input[j][i] != currentChar)
                return input[0].Substring(0, i);
        }
    }

    return input[0].Substring(0, minLength);
}
2개의 좋아요

저도 해봤습니다

string[] input = { "flower", "flight", "fly", "flow" };
Console.WriteLine("Longest Common Prefix is- " + input.LongestCommonPrefix()); // Output: "fl"

public static class StringExtensions
{
    public static string LongestCommonPrefix(this IEnumerable<string>? source)
    {
        if (source == null || !source.Any()) return string.Empty;
        
        var firstString = source.First();
        var index = 0;
        foreach (var c in firstString)
        {
            if (source.All(s => s.Length > index && s[index] == c) == false) break;
            index++;
        }
        return firstString[..index];
    }
}   
1개의 좋아요

저도 도전.

string FindLongestCommonPrefix(IEnumerable<string> input) => input.Aggregate
(
    (a: string.Empty, index: 0),
    (t, next) => t.index switch
    {
        0 => (next, 1),
        _ => (t.a[..t.acc.AsSpan().CommonPrefixLength(next)], 1)  
    },
    (t) => t.a
);
2개의 좋아요