编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
暴力,主要是注意索引不要越界:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ''
res = ''
ss = strs[0]
n = len(ss)
lens = len(strs)
for i in range(n): #第一个字符串的索引
for j in range(1,lens): #字符串列表的索引
if i>len(strs[j])-1: #索引越界则返回结果
return res
if strs[j][i]!=ss[i]: #发现不等的时候返回结果
return res
res+=ss[i]
return res
通过题解区大佬的代码学习了zip(*)的用法,这个*是拆包的意思,主要是用于传多值参数的情况
比如经常看到的func(*args,**kargs),传多个参数时一个*使多个参数被当作一个元组传递进去,两个*代表当作一个字典
而zip的作用是是打包成包含元组的zip对象
(模拟一下,比如list ["flo","flo","fli"]经过*拆包成元组后分别变成('f','l','o'),('f','l','o'),('f','l','i')
然后zip打包将第一列,第二列,第三列分别包在一起 变成('f','f','f'),('l','l','l'),('o','o','i')
ps:上述两行都是我自己主观臆测方便理解的,我觉得挺有道理, 具体内部是否这样暂未考证,因为一般都是zip(*list)直接出结果,不拆开解释,结果也是一个zip对象的迭代器。)
下面用zip(*)解这个题:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
res = ''
for i in zip(*strs):
if len(set(i))==1: #说明都是重复的
res+=i[0]
else:
break
return res
代码来源https://www.runoob.com/python/python-func-zip.html python菜鸟教程zip函数中的例子