最长公共前缀

86 阅读2分钟

刷题的时候每次看到这题都会不由自主的跳过,不敢去做。今天剖析一下,学到的和已有的几种方法,供自己回忆复习吧。 leetcode.cn/problems/lo…

方法一:横向比较

将第一二个字符串比较得到的公共前缀,与第三个进行比较.

LCP(S1...Sn) = LCP(LCP(LCP(S1,S2),S3,...Sn)

class Solution {
    public String longestCommonPrefix(String[] strs) {
    
        if(strs == null || strs.length == 0){ //如果长度为0或字符串为空,则直接输出,
                                //但题目提示明确告知长度最小为1,所以在这道题,该if语句可以省去
            return "";
        }
        String pre = strs[0]; //默认公共前缀为第一个字符串
        int count = strs.length;
        for(int i = 1 ; i < count ;i++){
            pre = longestCommonPrefix(pre , strs[i]); //将上一次得到的公共前缀与本次遍历的字符串比较
            if(pre.length() == 0) break;//一旦发现某两个没有检测出公共前缀就直接跳出,结束程序

        }
        return pre;
    }
    public String longestCommonPrefix(String str1 , String str2){
        int size = Math.min(str1.length() , str2.length());  //以最短长度的为边界进行遍历比较
        int index = 0; //这两个字符串公共前缀的长度
        while (index < size && str1.charAt(index) == str2.charAt(index)) {
            index++;
        }
        return str1.substring(0, index);   //截str1从0开始到index结束的字符串

    }
}

方法二:纵向

竖着比较,以第一个字符串,为标准。取出该字符串的第X个字符,去跟后面字符串的X字符比较。(x从0开始,若没有不符合的,就一直比较到str[0].length())

"flower"

"flow"

"fqqq"

class Solution {
    public String longestCommonPrefix(String[] strs) {
    
        if(strs == null || strs.length == 0)    return "";
        int size = strs[0].length(); //记录了第一个字符串的长度
        int count = strs.length; //记录字符串的个数
        
    // 先依次遍历每个字符串的第一个,若相同再是遍历每个字符串的第二个,依此类推

        for(int i = 0 ; i < size ; i++){  //按照第一个字符串的长度循环,至于长度问题看下面if
            char c = strs[0].charAt(i);  //逐个取出第一个字符串的字符
            for(int j = 1 ; j < count ;j++){  //从下标1的字符串开始
                if( i == strs[j].length() || strs[j].charAt(i) != c){  
                            //如果i的长度 等于 该遍历字符的长度(说明该字符串已遍历完)||
                              //该字符串的i字符和第一个字符串的i字符不相等
                     return strs[0].substring(0, i);  //一旦碰到不符合的就返回
                }
            }
        }
        return strs[0]; 
    }
}