今天是第5道简单题,以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
说明: 所有输入只包含小写字母 a-z
。
解法1。最常规的,将题干条件拆解,首先找到最短的字符串min_str长度(最长公共前缀必须不长于最短的字符串),再以输入的字符串组的第一个字符串为基准,逐个比较所有字符串第1、2、3,…,len(min_str)位上的字符是否相等,相等则把该字符存到一个list里,不相等则return这个list,代码如下:
# V 1.0,能提交
class Solution:
def longestCommonPrefix(self, strs):
# 一定要在最开始对输入的字符串组strs做判断,这是第一步
if(strs is None or len(strs) == 0):
return ''
# 容器初始化,必须写在预判的后面,如果写在最前面会报错“IndexError: list index out of range”
# 经过谷歌百度发现这是因为如果strs为空的话就无法取到strs[0],注意,这是第二步
i = 0
commonlist = list()
min_len = len(strs[0])
# 找出最小的长度
for s in strs:
if(len(s) < min_len):
min_len = len(s)
# 逐个遍历其他字符串与第一个字符串的每一位字符是否一样,不一样就返回,一样就继续比,并存储比较通过的字符到容器commonlist里
while i<=min_len-1:
character = strs[0][i]
for s in strs:
if s[i] != character:
return "".join(commonlist)
commonlist.append(character)
i = i+1
return "".join(commonlist)
解法2。用zip函数获取一个类似于元组集合的对象,第i个元组存储的是所有字符串的第i个字符,元组个数等于最短的字符串包含的字符个数,所以只需要遍历每一个元组,判断该元组是否只包含一种字符,若是则保存到一个容器中,若不是则返回该容器。
# V 2.0,能提交,使用zip函数
class Solution:
def longestCommonPrefix(self, strs):
commonlist = ''
if(strs is None or len(strs) == 0):
return ''
for i in range(len(strs)):
strs[i] = list(strs[i])
tmp = zip(*strs) # zip函数的作用见下面解释
for i in tmp:
if(set(i) == 1):
commonlist += i[0]
else:
return commonlist
return commonlist
nums = ['flower','flow','flight']
for i in zip(*nums):
print(i)
输出:
('f', 'f', 'f')
('l', 'l', 'l')
('o', 'o', 'i')
('w', 'w', 'g')
解法1:https://blog.csdn.net/weixin_42456864/article/details/80703189
解法2:https://blog.csdn.net/yurenguowang/article/details/77848771