Leetcode 最长公共前缀

92 阅读2分钟

Leetcode 最长公共前缀

最长公共前缀是一个非常典型的字符串问题,只要具备一定的字符串算法基础,就能很快地解决此问题。本文将从以下三个方面来讲解最长公共前缀问题:

  1. 算法思路
  2. 代码实现
  3. 时间复杂度分析

算法思路

最长公共前缀问题可以描述为:给定一个字符串数组,要求找到这些字符串的最长公共前缀。我们可以从第一个字符串开始,依次遍历所有字符串的相应位置,只要当前位置的字符相同,就继续向后遍历,否则直接返回当前位置之前的字符串,即为最长公共前缀。

例如,对于字符串数组["hello","hey","hepatic","helpful"],我们从第一个字符串"hello"开始遍历,发现第一个字符都是"h",则继续遍历。第二个字符也相同,则继续遍历。第三个字符发现不同,返回"he"即可,即为最长公共前缀。

代码实现

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) {
        return "";
    }
    String commonPrefix = strs[0];
    for (int i = 1; i < strs.length; i++) {
        int j = 0;
        while (j < commonPrefix.length() && j < strs[i].length() && commonPrefix.charAt(j) == strs[i].charAt(j)) {
            j++;
        }
        commonPrefix = commonPrefix.substring(0, j);
        if (commonPrefix.isEmpty()) {
            return commonPrefix;
        }
    }
    return commonPrefix;
}

时间复杂度

对于字符串数组中长度最短的字符串长度为m,字符串数组的长度为n,最长公共前缀长度为k,时间复杂度为O(m*n)。因为我们需要对所有字符串进行遍历操作,时间复杂度与字符串数组长度以及字符串长度有关。

结论

最长公共前缀问题看似简单,但是也存在一些坑点,如当字符串数组为空或者某个字符串为空字符串的情况。使用上面的代码实现能够轻松解决该问题,并且时间复杂度也比较优秀。

完整代码如下:

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        String commonPrefix = strs[0];
        for (int i = 1; i < strs.length; i++) {
            int j = 0;
            while (j < commonPrefix.length() && j < strs[i].length() && commonPrefix.charAt(j) == strs[i].charAt(j)) {
                j++;
            }
            commonPrefix = commonPrefix.substring(0, j);
            if (commonPrefix.isEmpty()) {
                return commonPrefix;
            }
        }
        return commonPrefix;
    }
}