leetcode 14: 最长公共前缀

leetcode 14: 最长公共前缀

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= strs.length <= 200

  • 0 <= strs[i].length <= 200

  • strs[i] 仅由小写英文字母组成

Related Topics

字符串

思路1:

遍历每一列字符对比,但是不知道有多少行。实际上可以使用while(true)死循环,当符合不是前缀的条件时,可以直接break退出。

需要注意的是,在进行比较字符前,需要判断字符是否存在,也就是用index和字符串的length做比较。 如果不存在,那么就不需要再判断前缀了。

public String longestCommonPrefix(String[] strs) {
    StringBuilder sb = new StringBuilder();
    int index = 0;
    //遍历每一列字符 由于不知道有一行字符串长度 使用true循环
    boolean flag = true;
    while(flag){
        // 字符不存在 就不需要判断了
        if(index>=strs[0].length()){
            break;
        }
        //开始往后比较
        for(int i = 1; i < strs.length;i++){
            //先判断字符是否存在 
            //存在的话 不相等 说明不是前缀
            if(strs[i].length()<= index || strs[i].charAt(index) != strs[i-1].charAt(index)){
                flag = false; //不是前缀 可以退出while循环
                break;//退出for循环
            }
​
        }
        //flag == false  说明不是前缀 退出while循环
        if(flag == false){
            break;
        }
        //都相等 说明是前缀
        sb.append(strs[0].charAt(index));
        index++;
    }
    return sb.toString();
}
解答成功:
            执行耗时:1 ms,击败了69.00% 的Java用户
            内存消耗:39.3 MB,击败了5.00% 的Java用户

思路1改进:

参考leetcode官方解答,可以以第一行的长度为标准,时间复杂度都一样,就是代码看起来简洁了很多。

public String longestCommonPrefix(String[] strs) {
​
    // 以第一行的字符串长度为标准
    for(int i = 0 ; i < strs[0].length();i++){
        char c = strs[0].charAt(i);
        //跟剩下的字符串比较第i列的字符
        for(int j = 1; j < strs.length;j++){
            //第j列字符长度不够 或者 字符不等于c  前缀计算完毕
            if(i == strs[j].length() || strs[j].charAt(i) != c){
                return strs[0].substring(0,i);
            }
        }
    }
    //如果 全部比完 则strs[0]就是前缀
    return strs[0];
}
解答成功:
            执行耗时:1 ms,击败了69.00% 的Java用户
            内存消耗:39.4 MB,击败了5.00% 的Java用户
上一篇:rsync使用小结


下一篇:uniapp app,小程序,公众号h5调用扫一扫