leetcode 14 最长公共子串

梦想的初衷 提交于 2020-04-05 21:50:01

原题点这里

 

水平扫描:依次取每个str的第i个字符,若相同,则公共子串+1,否则结束。

public static String longestCommonPrefix(String[] strs) {

        int strNum = strs.length;
        if(strNum==1) return strs[0];
        int minLen = Integer.MAX_VALUE;
        for(int i=0;i<strs.length;i++)
            minLen=Math.min(minLen,strs[i].length());
        StringBuilder res = new StringBuilder("");
        for(int i=0;i<minLen;i++){
            boolean flag=true;
            char c = strs[0].charAt(i);
            for(int j=1;j<strNum;j++){
                if(strs[j].charAt(i)!=c){
                    flag=false;
                    break;
                }
            }
            if(flag){
                res.append(c);
            }else{
                break;
            }
        }
        return res.toString();
    }
View Code

 

JAVA有个类库,可以直接在一个字符串中,找到另一个字符串  indexOf() ,这样的我们依次取最大子串就可以:

LCP(S1​…Sn​)=LCP(LCP(LCP(S1​,S2​),S3​),…Sn​)

所以我们可以这样:

public String longestCommonPrefix(String[] strs) {
        if (strs.length == 0) return "";
        String prefix = strs[0];
        for (int i = 1; i < strs.length; i++)
            while (strs[i].indexOf(prefix) != 0) {
                prefix = prefix.substring(0, prefix.length() - 1);
                if (prefix.isEmpty()) return "";
            }        
        return prefix;


    }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!