一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
1.描述
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
- 1 <= strs.length <= 200
- 0 <= strs[i].length <= 200
- strs[i] 仅由小写英文字母组成
2.分析
- 过滤掉无值和只有一个值的情况
- 取出列表中最短的字符串(如果有最长公共前缀,最多也就是其中最短的一个值)
- 遍历列表,判断每一个字符串在从开头截取出来的同等长度下是否一样,一样的话,计数加1;不一样直接跳过
- 判断本次循环结束最终的计数是否与列表长度一致,一致,说明这就是最长公共前缀
- 不一致,将当前最短值截取掉最后一位,加上死循环,再次进行判断
- 如果没有公共前缀,在最短值切成空字符串时,判断相等,循环结束
3.AC代码
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ""
if len(strs) == 1:
return strs[0]
# 取出列表中最短的值
s_min = min(strs, key=len)
while 1:
t_num = 0 # 本次循环中能对上的数量
for i in range(len(strs)):
if s_min == strs[i][:len(s_min)]:
t_num += 1
if t_num == len(strs):
return s_min
s_min = s_min[:-1]
return ""
4.总结
纵向解法比较符合我们平时的思考过程,官方居然给了4种答案,感觉有点强行加戏了。
不过话说回来,分治的思想确实更高级一些。
参考
画解算法:14. 最长公共前缀 - 最长公共前缀 - 力扣(LeetCode) (leetcode-cn.com)
14. 最长公共前缀,python3 - 最长公共前缀 - 力扣(LeetCode) (leetcode-cn.com)