算法练习:最长公共前缀

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

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

示例 1:

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

示例 2:

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

提示:

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

Related Topics

字符串

👍 1979

👎 0

思路一:暴力匹配(卑微的我只想到了这一种)

​ 采用暴力匹配的思路,先拿到第一个字符串及其长度len,然后去遍历整个字符串数组,每次比较len和遍历的字符串长度,取其中较小的(公共前缀比所有字符串都短),然后再去对字符串中的每个字符依次比较,如果不同则更改长度len并且跳出循环去遍历下一个字符串。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int len = strs[0].length();//得到第一个字符串的长度
        String res = strs[0];//得到第一个字符串
        for (int i = 1; i < strs.length; i++) {
            len = Math.min(strs[i].length(),len);
            for (int j = 0; j < len; j++) {
                if(res.charAt(j) != strs[i].charAt(j)){
                    len = j;
                    break;
                }
            }
        }
        return res.substring(0,len);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tuMkvNeS-1642746383537)(C:\Users\zky\AppData\Roaming\Typora\typora-user-images\image-20220121140955020.png)]

时间复杂度O(n^2),空间复杂度O(1)。

思路二:巧妙解法

通过java里面的startwith函数来判断每一个字符串是否以指定的字符串开始。如果不是,则将去掉字符串的最后一个字符再进行比较。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length==0)return "";
        //公共前缀比所有字符串都短,随便选一个先
        String s=strs[0];
        for (String string : strs) {
            while(!string.startsWith(s)){
                if(s.length()==0)return "";
                //公共前缀不匹配就让它变短!
                s=s.substring(0,s.length()-1);
            }
        }
        return s;
    }
}

每次都可能要去修改字符串,导致内存消耗增大,但是时间消耗减少了。