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

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

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

示例 1:

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

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

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

posted on 2021-09-30 16:43  进击的davis  阅读(91)  评论(0)    收藏  举报

导航