如题
最直观的做法,依次用strs[0]的每个字符去匹配所有其他字符串的相同位置
public static String get(String[] strs) {
if(strs.length==0){
return "";
}
if(strs.length==1){
return strs[0];
}
String str = strs[0];//最大前缀
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (i == strs[1].length()) {//strs[1]都匹配上
return strs[1];
}
boolean b = ch == strs[1].charAt(i);
for (int m = 2; m < strs.length; m++) {//后续依次匹配同一位置
if (i == strs[m].length()) {//同样的 当前字符串即最大匹配
return strs[m];
}
b = b & (ch == strs[m].charAt(i));//
}
if (b == false) {
return i == 0 ? "" : str.substring(0, i);//当前index无法全部匹配
}
}
return str;
}
这种很显然当字符串数过多时且匹配串较短时比较浪费时间
那么换一种思路,用到当前字符串的最大前缀去匹配下一个字符串
public static String get1(String[] strs) {
if(strs.length==0){
return "";
}
if(strs.length==1){
return strs[0];
}
String s = strs[0];// 最大前缀
int dx = s.length()-1;//当前匹配的最大前缀index
for (int i = 1; i < strs.length; i++) {
for(int m=0;m<=dx;m++){//依次用当前符合的前缀去匹配下一个字符串
if(m<strs[i].length()&&strs[i].charAt(m)==s.charAt(m)){
}else if(m<strs[i].length()){//
dx=m-1;
}else{//等同于m==strs[i].length()
dx=m-1;
break;
}
}
if(dx==-1){//完全未匹配上
return "";
}
}
return dx==s.length()?s:s.substring(0,dx+1);
}
居然没有太大区别。。。。