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 = prefix[:-1]
if not 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):
char = strs[0][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)(不考虑排序中使用的额外空间)