题目地址:
https://www.lintcode.com/problem/longest-common-prefix/description
给定一列字符串,求其最长公共前缀。
可以用二分答案的办法来做。由于公共前缀必然是这些字符串里最短的那个字符串的子串,所以可以先找到最短的字符串,然后对其进行二分,二分这个前缀的最后一个字符的下标;每次二分就逐一验证是否是公共前缀,如果是,则右移下标,否则左移。代码如下:
public class Solution {
/**
* @param strs: A list of strings
* @return: The longest common prefix
*/
public String longestCommonPrefix(String[] strs) {
// write your code here
if (strs == null || strs.length == 0) {
return "";
}
// 找最短的那个字符串
String shortest = null;
int minLen = Integer.MAX_VALUE;
for (String s : strs) {
if (s.length() < minLen) {
minLen = s.length();
shortest = s;
}
}
// 如果最短的那个字符串为空,则公共前缀就是空串
if (shortest == null || shortest.isEmpty()) {
return "";
}
// 接下来进行二分
int l = 0, r = shortest.length() - 1;
while (l < r) {
int m = l + (r - l + 1 >> 1);
if (isPrefix(strs, shortest.substring(0, m + 1))) {
l = m;
} else {
r = m - 1;
}
}
// 截取出最终答案,return前判断一下是否满足条件
String res = shortest.substring(0, l + 1);
return isPrefix(strs, res) ? res : "";
}
private boolean isPrefix(String[] strs, String s) {
for (String str : strs) {
if (!str.startsWith(s)) {
return false;
}
}
return true;
}
}
时间复杂度 O ( n l log l ) O(nl\log l) O(nllogl),其中 n n n为字符串个数, l l l为最短字符串的长度;空间 O ( 1 ) O(1) O(1)。