4.<tag-字符串和常规>-lt- 14. 最长公共前缀
lt- 14. 最长公共前缀
[案例需求]

[思路分析一, 横向比较法]
- 遍历字符数组, 两两进行比较, 记录当前比较出的公共前缀值, 就这样比较下去, 找出所有的字符都含有的公共前缀(不断的更新前缀, 为了使所有的字符都含有该前缀, 肯定是去最小值了);

[代码实现]
//暴力匹配,
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length < 1) return "";
if(strs.length == 1)return strs[0]; // 单个字符
int prefix = Integer.MAX_VALUE;
//不断的两两比较,更新较大的前缀
for(int i = 1; i < strs.length; i++){
String str1 = strs[i - 1];
String str2 = strs[i];
//Q: 如何比较两个字符串?
//charAt(i)逐一比对
int minLength = Math.min(str1.length(), str2.length());
int index = 0;
while(index < minLength && str1.charAt(index) == str2.charAt(index)){
++index;
}
prefix = Math.min(prefix, index);
if(prefix == 0)break;
}
return strs[0].substring(0, prefix);
}
}
官方解法
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
String prefix = strs[0];
int count = strs.length;
for (int i = 1; i < count; i++) {
prefix = longestCommonPrefix(prefix, strs[i]);
if (prefix.length() == 0) {
break;
}
}
return prefix;
}
public String longestCommonPrefix(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);
}
}
时间复杂度分析
- 时间复杂度:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
- 空间复杂度:O(1)。使用的额外空间复杂度为常数。
[思路分析二, 纵向比较法]

浙公网安备 33010602011771号