天天看点

014-leetcode算法实现之最长公共前缀-longest-common-prefix(LCP) - python&golang实现

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

  • ​​https://leetcode-cn.com/problems/longest-common-prefix​​

示例 1:

输入:strs = ["flower","flow","flight"]

输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]

输出:""

解释:输入不存在公共前缀。

提示:

1 <= strs.length <= 200

python

# 方法一 时间O(mn),空间O(1)
def longest_common_prefix(strs: [str]) -> str:
    """
    最长公共前缀 -> 纵向扫描
    :param strs: [str]
    :return: str
    """
    if not strs:
        return ''

    length, count = len(strs[0]), len(strs)
    for i in range(length):
        ch = strs[0][i]
        for j in range(1, count): # 第二行开始比较
            if i == len(strs[j]) or strs[j][i] != ch:
                return strs[0][:i]

    return strs[0]

# 方法二
def lcp(strs: [str]) -> str:
    """
    最长公共前缀 -> 横向扫描
    # 可以先按字符串长度排序
    :param strs:  [str]
    :return: str
    """
    if not strs:
        return ''

    def lcp_handle(prefix: str, next: str) -> str:
        length, index = min(prefix, next), 0
        while index < length and prefix[index] == next[index]:
            index += 1
        return prefix[:index]

    prefix, count = strs[0], len(strs)
    for i in range(1, count):
        prefix = lcp_handle(prefix, strs[i])
        if not prefix:
            break
    return prefix


if __name__ == "__main__":
    strs1 = ['flight', 'flies', 'fly']
    print(longest_common_prefix(strs1)) # 此情况比较3*3=9
    strs2 = ['skxxuard'] * 5
    print(longest_common_prefix(strs2)) # 最坏情况,元素数量5,每个元素长度8,一共比较40次,即mn