14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
解题重点
- 最长公共前缀一定不会比最短字符串长 所以我们可以找到最短的字符串(只需要长度 不需要字符串)
- 写一个方法来判断一个字符串是不是公共前缀 时间复杂度 O(m*n) m:字符串总长度 n:字符串个数
- 我们只需要在最短的字符串里进行二分查找 一直匹配到不再是公共前缀
public static String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
int minLength = Integer.MAX_VALUE;
//获取最短长度
for (String s : strs) {
if (s.length() < minLength)
minLength = s.length();
}
// 二分法
int low = 0;
int height = minLength;
while (low < height){
int middle = (low + height+1) / 2;
if (!isCommonPrefix(strs,middle)) {
height = middle - 1;
}else {
low = middle;
}
}
return strs[0].substring(0,low);
}
public static boolean isCommonPrefix(String[] strs, int mid) {
if (mid == 0) return false;
String pre = strs[0].substring(0, mid);
for (String s : strs) {
for (int j = 0; j < mid; j++) {
if (pre.charAt(j) != s.charAt(j)) {
return false;
}
}
}
return true;
}