题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
解法一:
常规解法:判断每一个字符串的对应列是否相同。
思路:固定住str[0]
,对str[0]
进行遍历,然后循环判断后面字符串对应的列字符是否相同。
class Solution(object):
def longestCommonPrefix(self, strs):
if len(strs) == 0:
return ''
for i in range(len(strs[0])):
c = strs[0][i]
for j in range(1,len(strs)):
# 遇到某个字符串已经遍历到最后,直接返回,因为最长公共前缀绝对是小于等于任何一个字符串的长度的
# 遇到列对应的字符串也直接返回
if i == len(strs[j]) or strs[j][i] != c:
return strs[0][0:i]
return strs[0]
解法二:
zip(*)
+ 遍历方法
zip()
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
语法:
zip([iterable, ...])
# iterabl -- 一个或多个迭代器;
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 *
号操作符,可以将元组解压为列表。
对上述示例一做解压缩如下:
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped) # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c)) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> a1, a2 = zip(*zip(a,b)) # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
>>>
res = [i for i in zip(*strs)]
print(res)
# 结果如下
[('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g')]
由结果可以看出,列表中的元组只要元组里面的所有元素都是一样的,那么当下的元组元素就是公共的。
我们只要从0开始遍历,遇到元组的元素都相同,就将元组的元组加进来res,遇到元组元素不全相同,即结束遍历。
完整解法
class Solution(object):
def longestCommonPrefix(self, strs):
str1 = ''
for i in zip(*strs):
if len(set(i)) == 1:
str1 += i[0]
else:
break
return str1
参考:
https://www.runoob.com/python3/python3-func-zip.html
https://www.runoob.com/python3/python3-func-zip.html