题目描述
编写一个函数来查找字符串数组中的最长公共前缀,如果不存在则返回"".
输出示例:
输入:["flower", "flow", "flight"]
输出:"fl"
输入:["dog", "racecar", "car"]
输出:""
解释:不存在公共前缀
解题思路分析
- 采用分治法可以求出:
如上图所示,我们将原问题LCP(Si.....Sj)分成两个子问题LCP(Si....Smid)和LCP(Smid+1......Sj),其中mid = (i + j) / 2;我们用子问题的解lcpLeft和lcpRight来构造原问题的解。从头到尾挨个比较lcpLeft和lcpRight中的字符,知道不能匹配为止。计算所得的lcpLeft和lcpRight的最长公共前缀就为原问题LCP(Si.....Sj)的解。
代码实现
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
return longestCommonPrefix(strs, 0, strs.length - 1);
}
private String longestCommonPrefix(String[] strs, int left, int right) {
if (left >= right) {//用于判断是否只剩下一个字符串了
return strs[left];
}
int mid = (left + right) >> 1;
String lcpLeft = longestCommonPrefix(strs, left, mid);//递归得到左边的字符串的公共前缀
String lcpRight = longestCommonPrefix(strs, mid + 1, right);//递归得到右边的字符串的公共前缀
return commonPrefix(lcpLeft, lcpRight);//找出两边的公共前缀的公共前缀
}
private String commonPrefix(String left, String right) {
int min = Math.min(left.length(), right.length());
for (int i= 0; i < min; i++) {
if (left.charAt[i] != right.charAt[i]) {
return left.subString(0, i);
}
}
return left.subString(0, min);
}