LeetCode腾讯精选50题--最长公共子串

题目:

 

 分析:

  本题要求求最长的公共子串前缀,但是有个很好突破的地方,就是数组为空时返回空字符串,所求为前缀,所以必须公共子串就必须从第一个字符开始,存在顺序,因此,我们以这个为关键,想出两中解决办法

  (1)以第一个字符串为基础,让它与下一个字符串对比,得到一个公共子串前缀,再将这个公共子串前缀与下一个对比,以此类推,得到所以字符串的公共子串前缀

 

 

  (2)多个字符串的同一个位置进行对比,一旦某个字符串的位置的字符和其他不同,就可以找到子串前缀,即全部字符的第0个位置对比,都一样,再对比第1个位置,以此类推

 

 

代码:

  方法一:

  

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0){
            return "";     //直接反空
        }
            
        String str =  strs[0];
        int length = strs.length;    //数组长度

        for(int i = 1;i < length;i ++){
            str = longestCommonPrefix(str,strs[i]);   //方法重载
            if(str.length() == 0){
                return "";      //一旦有一个字符串不合理,直接反空
            }
        }

        return str;
    }

    public String longestCommonPrefix(String str1,String str2){
        int len = Math.min(str1.length(),str2.length());
        for(int i = 0;i < len;i ++){
           if(str1.charAt(i) != str2.charAt(i)){    //一旦有不一样的直接返回
                return str1.substring(0,i);
            }
        }
        return str1.substring(0,len);    //都一样
    }
}

  方法二:

  

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0){
            return "";     //直接反空
        }
        
        int len = strs.length;   //数组长度获取
        String str = strs[0];     //第一个字符串为例子
        int length = str.length();    //第一个字符串长度
        for(int i = 0;i < length;i ++){    //以第一个字符串的长度为基础
            for(int j = 1;j < len;j ++){      //遍历数组,所有字符串的相同位置
                if(strs[j].length() <= i || str.charAt(i) != strs[j].charAt(i) ){
                    /**
                    一旦字符串的同一位置不一样,就直接返回数据
                    需要注意的时,当出现长度小于第一个字符串长度的字符串时,需要判断 且两者条件不能变换位置  
                     */
                    return str.substring(0,i);
                }
            }
        }
       

        return str;
    }

   
}

时间复杂度均为O(nm)

空间复杂度均为O(nm)

posted @ 2022-09-23 17:57  [吃瓜][吃瓜]  阅读(87)  评论(0编辑  收藏  举报