目录
介绍
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i]
仅由小写英文字母组成
解题思路
我们可以采用横向扫描的方法,以第一个字符串为基准,逐个字符地与其他字符串进行比较,直到出现不匹配的字符或者某个字符串长度不足为止。具体步骤如下:
- 如果输入的字符串数组为空,则直接返回空字符串。
- 以第一个字符串为基准,遍历其每个字符:
- 获取当前位置的字符。
- 逐个检查其他字符串在相同位置的字符是否相同。
- 如果有不匹配的字符或者某个字符串长度不足,则返回当前已匹配的前缀部分。
- 如果遍历完第一个字符串后,未出现不匹配的情况,则返回第一个字符串本身作为最长公共前缀。
代码实现
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if not strs:
return ""
# 找到字符串数组中最短的字符串长度
min_len = min(len(s) for s in strs)
# 遍历最短的字符串长度
for i in range(min_len):
# 检查当前位置的字符是否都相同
if len(set(s[i] for s in strs)) > 1:
# 如果有不同的字符,则当前位置之前的字符串即为最长公共前缀
return strs[0][:i]
# 如果所有字符串都一样,则返回任意一个字符串
return strs[0][:min_len]
总结
算法复杂度分析: 对于给定的 n 个字符串,假设最长公共前缀的长度为 m,那么该算法的时间复杂度为 O(m*n),其中 m 是最长公共前缀的长度,n 是字符串数组的长度。空间复杂度为 O(1),因为我们只使用了常数级别的额外空间。