最大公共前缀(Longest Common Prefix)问题是求多个字符串的最大公共前缀。
我们可以使用横向扫描法实现最大公共前缀算法:
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
int minLen = Integer.MAX_VALUE;
for (String str : strs) minLen = Math.min(minLen, str.length());
int i = 0;
while (i < minLen) {
char c = strs[0].charAt(i);
for (int j = 1; j < strs.length; j++) {
if (strs[j].charAt(i) != c) return strs[0].substring(0, i);
}
i++;
}
return strs[0].substring(0, minLen);
}
算法流程:
- 获取所有字符串的最小长度 minLen。
- 从左到右取每个字符 c,并与其他所有字符串当前位置的字符比较。
- 如果相等,继续比较下一个位置。否则终止比较,返回结果。
- 如果全部比较完成,返回 minLen 长度的公共前缀。
- 特殊情况,如果 strs 为空数组,返回 “”。
时间复杂度 O(S),S为所有字符串中字符数之和,空间复杂度 O(1)。
所以,最大公共前缀的关键是:
- 找到所有字符串的最小长度minLen,限定比较范围。
- 从左到右逐个字符比较,如果当前位置字符相等,继续比较下一个位置。
- 否则说明找到最大公共前缀,将该前缀返回。
- 如果全部比较完成,返回minLen长度的前缀。
- 特殊情况过滤。