LeetCode第十四题(最长公共前缀)

162 阅读2分钟

纵向对比(Java)

核心思想: 从前往后遍历字符串数组中所有字符串的每一个字符,比较相同位置上的字符是否相同,如果相同,则继续对下一位置进行比较,如果不相同或超过字符串数组中某一字符串的长度,则当前位置上的字符不再属于公共前缀,当前位置之前的部分字符,为最长公共前缀。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        StringBuilder sb = new StringBuilder();
        //以字符串数组的首字符串为基准进行纵向对比
        for(int i = 0; i < strs[0].length(); i++){
            char ch = strs[0].charAt(i);//从前往后依次获取基准字符串的每一个字符
            //纵向对比字符串数组其他字符串对应位置上的字符
            for(int j = 1; j < strs.length; j++){
                //若超过字符串数组中某一字符串的长度或者字符串数组中字符串对应位置上的字符不相同
                if(i == strs[j].length() || strs[j].charAt(i) != ch)
                    return sb.toString();
            }
            sb.append(ch);
        }
        return sb.toString();
    }
}

横向对比(Java)

核心思想: 将字符串数组的前两个字符串进行对比,得到公共前缀,再将公共前缀和第三个字符串对比,得到新的公共前缀,如此直至将字符串数组中的所有字符串对比完毕或者公共前缀为空,得到最长公共前缀。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        String lcp = strs[0];//最长公共前缀
        //依次将公共前缀和字符串数组的所有字符串进行对比
        for(int i = 1; i < strs.length; i++){
            if(lcp.length() == 0)//公共前缀为空
                break;
            lcp = commonPrefix(lcp, strs[i]);
        }
        return lcp;
    }
    //求两个字符串的公共前缀
    public String commonPrefix(String str1, String str2){
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < str1.length(); i++){
            //若超过后一字符串的长度或者两个字符串对应位置上的字符不相同
            if(i == str2.length() || str1.charAt(i) != str2.charAt(i))
                return sb.toString();
            sb.append(str1.charAt(i));
        }
        return sb.toString();
    }
}