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)