LeetCode每日一题之最长公共子串
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。
实例: 输入:strs = [“flower”,“flow”,“flight”] 输出:“fl”
输入:strs = [“dog”,“racecar”,“car”] 输出:"" 解释:输入不存在公共前缀。
思路
1、这道题首先应该将字符数组中的每个元素读取出来,从而实现他们直接的比对(这一点不管是方法一,还是方法二,都是共通的) 2、其次,读取出来后,就是比对,从而得到共同的最长前缀(方法一和方法二在这里就出现了分化: 方法一: 采取重写一个方法,实现比对两个字符串的匹配情况,返回最长公共子串,然后比较所有字符串 方法二: 调用startsWith()方法,先比对所有字符串是否符合,不符合则将字符串裁断-1,再比对,再剪短,得到最长公共子串) 3、最后就是返回该值了
方法一:
class LongCommonStr{
public String LongCommonStr(String[] str){
if(str==null||str.length==0){
return "";
}
String s=str[0];
for(int i=0;i<str.length;i++){
s=LongCommonStr(s,str[i]);
if(s.length()==0){
break;
}
}
return s;
}
public String LongCommonStr(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);
}
}
方法二:
public class LongCommonStr1 {
public String LongCommonStr1(String[] str){
if(str==null||str.length==0){
return "";
}
String s=str[0];
for(int i=0;i<str.length;i++){
while(!str[i].startsWith(s)) {
if (s.length() == 0) {
break;
}
s=s.substring(0,s.length()-1);
}
}
return s;
}
}
结尾处的几点思考
1、对于任何传入方法中的数组类型,第一步都是判断一下它是否为空数组,因为一般这样操作,直接就能得到一种情况的解
2、温故: 实现for遍历循环的方法除了 正常for(int i=0;i<str.length;i++) 还有for(String string :str)
3、对于一个循环,一般我们都要考虑两种情况,一种是正常结束了循环,一种是触发条件,然后结束循环(模板了,直接用)
4、对于java,有很多内置方法来解决问题,如之前的reverse()方法,今天的startsWith()方法,以及常用的charAt(); 多查查,多练练
|