力扣打卡:14. 最长公共前缀
解题思路
设定公共长度是第一个元素的长度
多利用已经计算过的结果来为新的计算服务
如:假设数组元素有多个
- 第一个和第二个元素已经比较过
- 那么第二个和第三个进行比较时,就受到了第一个和第二个元素比较结果的约束
Math.min(第二个和第三个元素的公共长度,第一个元素和第二个元素公共长度)
- 在比较时,只需要找到最小的len即可,无需全部遍历
代码
class Solution {
public String longestCommonPrefixA(String[] str) {
String s = "";
int min = Integer.MAX_VALUE;
// 取第一个和每一个的公共长度,取最小值
// 得到的最后就是最长的公共长度,注意转换关系
for(int i=1;i<str.length;i++) {
int len = judge(str[0],str[i]);
min = min<len ? min : len ;
}
// 判断条件的写法
// 第一个将一个长度的剔除,因为只有一个元素时,min也是MAX值,所以去除一个元素的情况
// 剩下的就是0 和 正常情况了,此时只需要判断正常情况就可以了
if(str.length==1)
s = str[0];
else if(min != Integer.MAX_VALUE) {
s = str[0].substring(0, min);
}
return s;
}
// 创建一个函数取判断第一个和每一个之前的公共长度
// 将0的长度包括在范围内
public static int judge(String s1 , String s2) {
int len = Math.min(s1.length(), s2.length());
for(int i=0;i<len;i++) {
if(s1.charAt(i)!=s2.charAt(i)) {
len = i;
break;
}
}
return len;
}
}
优化
// 思路:一直比较得到每一次的最小公共长度
public String longestCommonPrefix(String[] str) {
int len = str[0].length();
for(int i=1; i<str.length; i++){
len = Math.min(len,judge(str[i-1],str[i],len));
if(len==0) return "";
}
return str[0].substring(0,len);
}
public int judge(String s1, String s2, int len){
int i=0;
for(; i<s1.length() && i<s2.length() && i<len; i++){
if(s1.charAt(i)!=s2.charAt(i)) {break;}
}
return Math.min(len,i);
}