leetcode_字符串 14.最长公共前缀函数

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

  • 如果不存在公共前缀,返回空字符串 “”

1. startswith()方法

  • 调用Python内置的startwith()方法,用于检查字符串是否以指定的子字符串开头
  • 语法: str.startswith(prefix[, start[, end]])
    • prefix:
      指定要检查的开头子字符串,可以是一个字符串或包含多个字符串的元组。
    • start(可选):
      起始检查的位置(索引)
    • end(可选):
      结束检查的位置(索引,开区间)
def func(strs):
    if not strs:  # 如果字符串数组为空,返回空字符串
        return ""
    
    # 假设输入的第一个字符串是公共前缀
    prefix = strs[0]
    
    # 遍历数组中的每个字符串,与当前的公共前缀逐一比较
    for s in strs[1:]:
        while not s.startswith(prefix):  # 如果当前字符串不以 prefix 开头
            # startswith() 是 Python 的内置字符串方法。它是字符串类型 (str) 提供的一部分,用于检查字符串是否以指定的子字符串开头。
            prefix = prefix[:-1]  # 将 prefix 从后往前缩短一位
            if not prefix:  # 如果 prefix 缩短到空字符串
                return ""
    
    return prefix

strs = ["flower", "flow", "flight"]
print(func(strs)) 
  • 时间复杂度:最坏情况下,遍历所有字符串并比较每个字符,时间复杂度是 O(S),S 是所有字符串的总字符数
  • 空间复杂度:O(1),仅使用了常量空间来存储 prefix

2. 按列比较法

  • 通过逐列比较每个字符串的字符,直到出现不同的字符为止。该方法的核心思想是遍历所有字符串中的每个字符,并逐列比较它们。
def func(strs):
    if not strs:  # 如果字符串数组为空,返回空字符串
        return ""
    
    # 获取最短字符串的长度,以避免越界
    min_len = min(len(s) for s in strs)
    
    # 按列逐字符比较
    for i in range(min_len):
        # 获取第一个字符串的第i个字符
        char = strs[0][i]
        
        # 遍历剩下的字符串,检查每个字符串的第i个字符
        for s in strs[1:]:
            if s[i] != char:
                return strs[0][:i]  # 如果有不同,返回当前的前缀
    
    return strs[0][:min_len]  # 如果没有不同,返回最短字符串的全部内容

strs = ["flower", "flow", "flight"]
print(func(strs))
  • 时间复杂度:O(S), S 是所有字符串的总字符数。最坏情况下,遍历所有字符并进行逐列比较
  • 空间复杂度:O(1)

3. 排序法

  • 排序法通过先将字符串数组按字典序排序,然后比较排序后的第一个和最后一个字符串,获得公共前缀。这种方法的关键是利用排序将相似的字符串排在一起,减少比较次数。
def func(strs):
    if not strs:  # 如果字符串数组为空,返回空字符串
        return ""
    
    strs.sort()  # 将字符串数组按字典序排序
    
    # 比较第一个和最后一个字符串的公共前缀
    first, last = strs[0], strs[-1]
    
    for i in range(min(len(first), len(last))):
        if first[i] != last[i]:
            return first[:i]
    
    return first  # 如果没有不同,返回第一个字符串

strs = ["flower", "flow", "flight"]
print(func(strs))
  • 时间复杂度:O(nlogn + S), n 是字符串的数量,S 是字符串的平均长度。排序时间复杂度为 O(nlogn),比较字符串的时间复杂度为 O(S)
  • 空间复杂度:O(1)(不考虑排序中使用的额外空间)

你可能感兴趣的:(leetcode,算法,python)