LeetCode之最长公共前缀超详细java讲解

描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。例如输入:strs = ["flower","flow","flight"],输出:"fl"。输入:strs =["dog","racecar","car",输出:""。

思路一:横向扫描,从第一个开始,把第一个逐个和后面的进行比较,得到最长公共前缀。

时间复杂度:O(m*n)其中m是字符串数组中的字符串的平均长度,n是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。

空间复杂度:O(1)常数个空间变量

    //方法一横向扫描
    public String longestCommonPrefix(String[] strs){
        if(strs.length == 0 || strs == null){
            return "";
        }
        String prefix = strs[0];
        for(int i = 1;i<strs.length;i++){
            prefix = longestCommonPrefix(prefix,strs[i]);
            if(prefix.length() == 0){
                return "";
            }

        }
        return prefix;
    }

    private String longestCommonPrefix(String str1, String str2) { //两个字符串的最长公共前缀
       int length = Math.min(str1.length(),str2.length());
        int index = 0;
        while(index<length && str1.charAt(index) == str2.charAt(index)){
            index++;
        }

        return str1.substring(0,index);  //取到第零个位置到第i个位置的字符串,即最长公共前缀。
    }

 

 

 思路二:纵向扫描,即从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀

时间复杂度:O(m*n)其中m是字符串数组中的字符串的平均长度,n是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。

空间复杂度:O(1)常数个空间变量

   //方法二纵向扫描
    public String longestCommonPrefix2(String[] strs){

       if(strs == null || strs.length == 0){
           return  "";
       }
       String prefix = "";
       int length = strs[0].length();
       int count = strs.length;
       for(int i = 0;i<length;i++){   //表示第一个字符串的第i位
           char c = strs[0].charAt(i);
            for(int j = 1;j<count;j++){  //从第二个字符串开始纵向比较
                 if(i == strs[j].length() || strs[j].charAt(i) != c){
                     return strs[0].substring(0,i);
                 } //i == strs[i].length()用于判断后面的字符串的长度是否小于第一个,这样就可以提前结束
            }      //strs[j].charAt(i) != c不相等,直接结束。
       }
        return strs[0];
    }

 

 

 

 

 

2021-05-27

posted @ 2021-05-27 12:39  华sam  阅读(613)  评论(0编辑  收藏  举报