返回

字符串数组中的最长公共前缀分析与实战

闲谈

导语:

LeetCode 14题:“最长公共前缀”是一道经典的字符串处理问题。它要求你找出给定字符串数组中最长的公共前缀。一个字符串的前缀是指其开头的一系列字符。

核心概念:

  • 公共前缀 :一组字符串的公共前缀是指这些字符串都以相同的一系列字符开头。例如,字符串“flower”和“flow”的公共前缀是“fl”。
  • 最长公共前缀 :一组字符串的最长公共前缀是指这些字符串中所有公共前缀中最长的一个。例如,字符串“flower”、“flow”和“flight”的最长公共前缀是“fl”。

算法:

有多种算法可以解决最长公共前缀问题。这里介绍其中两种最常用的算法:

1. 水平扫描法:

水平扫描法是一种简单的算法,它逐个字符地比较字符串数组中的所有字符串,以查找公共前缀。如果所有字符串在某个位置都不相同,则该位置就是公共前缀的结束。

def longest_common_prefix(strs):
    """
    :type strs: List[str]
    :rtype: str
    """
    if not strs:
        return ""

    # 找到字符串数组中最短的字符串
    shortest_str = min(strs, key=len)

    # 逐个字符地比较字符串数组中的所有字符串
    for i in range(len(shortest_str)):
        char = shortest_str[i]
        for str in strs:
            if str[i] != char:
                # 如果某个字符串在某个位置与公共前缀不同,则该位置就是公共前缀的结束
                return shortest_str[:i]

    # 如果所有字符串都比较完了,则返回公共前缀
    return shortest_str

2. 垂直扫描法:

垂直扫描法是一种更快的算法,它比较字符串数组中各个位置的字符,以查找公共前缀。如果某个位置的所有字符都相同,则该位置是公共前缀的一部分。

def longest_common_prefix(strs):
    """
    :type strs: List[str]
    :rtype: str
    """
    if not strs:
        return ""

    # 找到字符串数组中最短的字符串
    shortest_str = min(strs, key=len)

    # 逐个位置地比较字符串数组中的所有字符串
    for i in range(len(shortest_str)):
        char = shortest_str[i]
        for str in strs:
            if str[i] != char:
                # 如果某个字符串在某个位置与公共前缀不同,则该位置就是公共前缀的结束
                return shortest_str[:i]

    # 如果所有字符串都比较完了,则返回公共前缀
    return shortest_str

示例:

strs = ["flower", "flow", "flight"]
print(longest_common_prefix(strs))  # "fl"

strs = ["dog", "racecar", "car"]
print(longest_common_prefix(strs))  # ""

strs = ["aa", "ab"]
print(longest_common_prefix(strs))  # "a"

结语:

LeetCode 14题:“最长公共前缀”是一道经典的字符串处理问题。本文介绍了两种解决该问题最常用的算法:水平扫描法和垂直扫描法。通过对算法的分析和实例代码的演示,你应该已经掌握了如何找出给定字符串数组中的最长公共前缀。