14.最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
解法一:用前缀树
class Solution { public String longestCommonPrefix(String[] strs) { Tire tire=new Tire(); int size=strs.length; for(String str:strs){ tire.insert(str); } String flagStr=strs[0]; String result=""; String find=""; for(int j=0;j<flagStr.length();j++){ find+=flagStr.charAt(j); int pass=tire.getPreNumber(find); if(pass==size){ result+=flagStr.charAt(j); } } return result; } public class TireNode{ public int pass; public int end; public TireNode[] nexts=new TireNode[26]; } public class Tire{ private TireNode root; public Tire(){ root=new TireNode(); } public void insert(String word){ if(word==null){ return; } TireNode node=root; node.pass++; int index=0; char[] chs=word.toCharArray(); for(int i=0;i<chs.length;i++){ index=chs[i]-'a'; if(node.nexts[index]==null){ node.nexts[index]=new TireNode(); } node=node.nexts[index]; node.pass++; } node.end++; } public int getPreNumber(String word){ if(word==null){ return 0; } char[] chs=word.toCharArray(); int index=0; TireNode node=root; for(int i=0;i<chs.length;i++){ index=chs[i]-'a'; if(node.nexts[index]==null){ return 0; } node=node.nexts[index]; } return node.pass; } } }
解法二:先求两个字符串的最大公公前缀,如果没有直接结束,如果有将之前求的最大前缀缀和下一个字符串继续比较每个字符
class Solution { public String longestCommonPrefix(String[] strs) { if(strs==null||strs.length==0){ return ""; } String prefix=strs[0]; for(int i=1;i<strs.length;i++){ prefix=getLongestPrefix(prefix,strs[i]); if(prefix.length()==0){//如果prefix的长度为0,提前结束 return ""; } } return prefix; } public String getLongestPrefix(String str1,String str2){ if(str1==null || str2==null){ return ""; } int minLength=Math.min(str1.length(),str2.length()); int index=0; for(int i=0;i<minLength;i++){ if(str1.charAt(i)==str2.charAt(i)){ index++; }else{//一遇到没有匹配的直接结束循环 break; } } return str1.substring(0,index); } }