leetcode 14 最长公共子串
水平扫描:依次取每个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(); }
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; }