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);
    }
}

  

posted @ 2021-09-04 08:42  sherry001  阅读(43)  评论(0编辑  收藏  举报