14.最长公共前缀

题目:

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

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

示例 1:

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

示例 2:

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

解法:

直觉解法:

基本就是遍历对照。

  • 最长公共前缀的长度不会大于最短字符串的长度,所以先选出一个最短字符串,缩小问题规模。(但是其实没必要)
  • 遍历对应位置,如果所有字符串对应位置匹配则记录该位。
  • 最后输出n位相同字符。
public class Solution {
    public string LongestCommonPrefix(string[] strs) {
        if(strs.Length == 0) return "";
        if(strs.Length == 1) return strs[0];
        // 选出一个最短的字符长度
        int len = strs[0].Length;
        for(int i = 0;i<strs.Length;i++)
        {
            if(strs[i].Length<len)
                len = strs[i].Length;
        }
        // num保存最多有几个字符串对应位置相同,index保存最多有多少位相同

        int index = 0;
        // 遍历公共长度
        for(int i = 0;i<len;i++)
        {
            char target = strs[0][i];
            int num = 0;
            // 遍历所有字符串
            for(int j = 0;j<strs.Length;j++)
            {
                // 检查不同字符串的对应位置
                if(strs[j][i] == target)
                {
                    num++;
                }
                else break;  
            }
            
            if(num<strs.Length)
                break;
            else
            {
                index++;
            }
        }
        string result = new string(strs[0].ToCharArray(),0,index);
        return result;
    }
}

官方题解

最长公共子串(Java):
public String longestCommonPrefix(String[] strs) {
    if (strs.length == 0) return "";
    String prefix = strs[0];
    for (int i = 1; i < strs.length; i++)
        while (strs[i].indexOf(prefix) != 0) {
            prefix = prefix.substring(0, prefix.length() - 1);
            if (prefix.isEmpty()) return "";
        }        
    return prefix;
}
水平扫描:

比较对应列上的字符是否相同。

分治:

这个算法的思路来自于LCP操作的结合律。将原问题分成两个子问题,用子问题的解来比较构成原问题的解。

二分查找:
原文地址:https://www.cnblogs.com/zhang-mo/p/10860704.html