14.最长公共前缀

238 阅读1分钟

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

过程分析

既然找的是相同的前缀,找到数组最小长度的字符串依次比较即可

1.获取数组最小和最大长度的字符串
2.比较最大和最小长度字符串的相同字符
3.遍历整个数组比较前缀如果不同则缩减前缀的长度直到找到相同项

public static string LongestCommonPrefix(string[] strs)
{
    if (strs.Length == 0) return string.Empty;
    strs = (from str in strs orderby str.Length select str).ToArray();
    string prefix = string.Empty;
    int prefixLen = 0;
    int len = strs[0].Length;
    var min = strs[0].ToCharArray();
    var max = strs[strs.Length - 1].ToCharArray();
    for (int i = 0; i <= len - 1; i++)
    {
        if (min[i] == max[i]) prefix += min[i].ToString();
    }
    if (string.IsNullOrEmpty(prefix))
        return prefix;
    prefixLen = prefix.Length;
    foreach (var s in strs)
    {
        string sub = s.Substring(0, prefixLen);
        if (!sub.Equals(prefix))
        {
            var subs = sub.ToCharArray();
            var prefixs = prefix.ToCharArray();
            var m = string.Empty;
            for (int i = 0; i <= sub.Length - 1; i++)
            {
                if (subs[i] == prefixs[i]) m += subs[i].ToString();
            }
            if (string.IsNullOrEmpty(m)) return m;
            prefix = m;
            prefixLen = prefix.Length;
        }
    }
    return prefix;
}