编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
- 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