最长公共前缀问题

927 阅读1分钟

题目描述

编写一个函数来查找字符串数组中的最长公共前缀,如果不存在则返回"".
输出示例:

输入:["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);
}