14.最长公共前缀

332 阅读1分钟

1.题目

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200 strs[i]
  • 仅由小写英文字母组成

2.答题

思路1:

  • 把第一个字符串的前缀都缓存下来
  • 循环后续字符串是否包含其中的值,并保存最大的序号
  • 结束条件

代码如下:

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length <= 0) {
            return "";
        }
​
        String first = strs[0];
        List<String> preList = new ArrayList<>(first.length());
        for (int i = 0; i < first.length(); i++) {
            preList.add(first.substring(0, i + 1));
        }
​
        int max = -1;
        for (int i = 1; i < strs.length; i++) {
            int tmpMax = -1;
            String str = strs[i];
            for (int j = 0; j < preList.size(); j++) {
                if (str.startsWith(preList.get(j))) {
                    tmpMax = i;
                } else {
                    break;
                }
            }
​
            if (tmpMax == -1) {//没有匹配成功的前缀,直接结束
                max = -1;
                break;
            }
​
            if (max == -1) {
                max = tmpMax;
            } else {
                max = Math.min(max, tmpMax);
            }
        }
​
        return max == -1 ? "" : preList.get(max);
    }
}

时间复杂度

遍历第一个元素是O(m),循环嵌套是O(nm),总体来说是O(m+mn)

提交结果

最长的公共前缀-提交结果1.png

这种写法比较乱,可以尝试一下步骤:

  • 循环字符串,对比是否以第一个元素开头
  • 是,继续执行,知道循环结束
  • 否,将第一个元素缩减一位
public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length <= 0) {
            return "";
        }
​
        String publicStr = strs[0];
        while (publicStr.length() != 0) {
            boolean flag = true;
            for (int i = 1; i < strs.length; i++) {
                if (!strs[i].startsWith(publicStr)) {
                    publicStr = publicStr.substring(0, publicStr.length() - 1);
                    flag = false;
                    break;
                }
            }
​
            if (flag) {
                return publicStr;
            }
        }
        return "";
    }
}

提交结果

最长的公共前缀-提交结果2.png

解法和上面基本相同,至少稍微简化了一点代码,再压榨一下,有木有其他解决方法,待以后水平高了再想吧gg