题目描述:
一、暴力破解
思路:
题目中要求的是返回字符串数组中的公共前缀,那么我们可以逐个字符进行比较,先比较第一个字符,看所有的字符串是否都有,如果都有就将这个前缀保存起来,然后截取两个,一直截取,直到没有公共前缀为止。将保存起来的公共前缀返回。
public static String longestCommonPrefix(String[] strs) {
//字符串数组为空 直接返回空字符串
if (strs.length == 0){
return "";
}
//需要返回的数组
String prefix = "";
//min 记录数组中最短字符串的长度
int min = strs[0].length();
for (String s : strs){
if (min > s.length()){
min = s.length();
}
}
//min等于0,说明数组中有空字符串,则直接返回空字符串
if (min==0){
return "";
}
//开始截取
for (int offset = 0; offset < min; offset++) {
//每次循环截取的长度加一
String str = strs[0].substring(0, offset + 1);
//遍历数组看是否所有的字符串都有这个前缀
for (String s : strs) {
//如果其中一个没有,就将前缀返回
if (!s.startsWith(str)) {
return prefix;
}
}
//如果都有 将前缀保存 进入下一个循环
prefix = str;
}
//返回最终的结果
return prefix;
}
二、从前往后逐个比较
思路:
首先另前缀等于字符数组中的第一个字符串,让前缀和第二个比较,返回公共的前缀,让后让前缀和第三个比较,一直到数组的最后一个字符串,此时前缀就是所有字符串的公共前缀。
如果在比较的途中,公共前缀等于空字符串,则直接返回。
public static String LongestCommonPrefix3(String[] strs){
if (strs.length==0){
return "";
}
String ans = strs[0];
for (int i = 1;i<strs.length;i++){
if (ans.length()==0){
return ans;
}
int min = Math.min(ans.length(),strs[i].length());
int j = 0;
for ( ; j < min;j++){
if (ans.charAt(j)!=strs[i].charAt(j)){
break;
}
}
ans = ans.substring(0,j);
}
return ans;
}
三、逐个缩减
思路:
将数组中的第一个作为公共前缀,看其他的所有字符是否包含这和前缀,如果不包含,就将前缀的长度减一,即将前缀的最后一个字符去掉。当所有的字符串都包含这个前缀,则将前缀返回。
在比较的途中如果遇见空字符串,则直接返回空字符串
在这里插public static String longestCommonPrefix4(String[] strs){
if (strs.length==0){
return "";
}
String ans = strs[0];
for (String ss : strs){
if (ss.length()==0){
return "";
}
while (!ss.startsWith(ans)){
if (ans.length()==0){
return ans;
}
ans = ans.substring(0,ans.length()-1);
}
}
return ans;
}入代码片