侧边栏壁纸
  • 累计撰写 49 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

最长公共前缀

Administrator
2025-04-22 / 0 评论 / 0 点赞 / 1 阅读 / 2907 字
温馨提示:
本文最后更新于 2025-04-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

最长公共前缀

查找字符串数组中的最长公共前缀

class Solution {
    /**
     * 查找字符串数组中的最长公共前缀。
     *
     * 该方法使用二分查找来优化寻找最长公共前缀的过程。
     * 它通过二分查找确定最长公共前缀的长度,然后通过逐字符比较来验证该长度是否是所有字符串的公共前缀。
     *
     * @param strs 字符串数组
     * @return 最长公共前缀,如果数组为空或没有公共前缀,则返回空字符串 ""
     */
    public String longestCommonPrefix(String[] strs) {
        // 1. 边界情况处理:如果数组为空或为 null,直接返回空字符串
        if (strs == null || strs.length == 0) {
            return "";
        }

        // 2. 找到最短字符串的长度:最长公共前缀的长度不可能超过最短字符串的长度
        int minLength = Integer.MAX_VALUE;
        for (String str : strs) {
            minLength = Math.min(minLength, str.length());
        }

        // 3. 初始化二分查找的左右边界
        int low = 0, high = minLength;

        // 4. 二分查找:在 [0, minLength] 的范围内进行二分查找,寻找最长公共前缀的长度
        while (low < high) {
            // 5. 计算中间值:注意 + 1,防止 low 和 high 相邻时,mid 始终等于 low,导致死循环
            int mid = (high - low + 1) / 2 + low;

            // 6. 判断长度为 mid 的前缀是否是所有字符串的公共前缀
            if (isCommonPrefix(strs, mid)) {
                // 7. 如果是公共前缀,那么最长公共前缀的长度至少为 mid,更新 low = mid
                low = mid;
            } else {
                // 8. 如果不是公共前缀,那么最长公共前缀的长度小于 mid,更新 high = mid - 1
                high = mid - 1;
            }
        }

        // 9. 循环结束后,low 的值就是最长公共前缀的长度,返回 strs[0].substring(0, low)
        return strs[0].substring(0, low);
    }

    /**
     * 判断长度为 length 的前缀是否是所有字符串的公共前缀。
     *
     * @param strs   字符串数组
     * @param length 前缀的长度
     * @return 如果长度为 length 的前缀是所有字符串的公共前缀,则返回 true;否则返回 false
     */
    public boolean isCommonPrefix(String[] strs, int length) {
        // 1. 从第一个字符串中提取长度为 length 的前缀
        String str0 = strs[0].substring(0, length);

        // 2. 获取字符串数组的长度
        int count = strs.length;

        // 3. 遍历剩余的字符串,将每个字符串的前 length 个字符与 str0 进行比较
        for (int i = 1; i < count; i++) {
            String str = strs[i];

            // 4. 逐字符比较
            for (int j = 0; j < length; j++) {
                // 5. 如果发现任何一个字符串的前 length 个字符与 str0 不相同,则返回 false
                if (str0.charAt(j) != str.charAt(j)) {
                    return false;
                }
            }
        }

        // 6. 如果所有字符串的前 length 个字符都与 str0 相同,则返回 true
        return true;
    }
}
0

评论区