编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
起初思路:
起初,我是想通过遍历循环来进行每个元素之间的比较,但是发现写起来会很麻烦,也出现了很多问题,出现的问题我也没能完全解决,所以就改变了思路,发现strs是字符串类型,就想到了字符串类型的大小比较是通过逐个字母的比较,所以只要找到最大的,和最小的,两个的公共部分就是最大前缀。另外也可以用内置函数zip()来将同位置的元素提取出来,再将同位置的元素进行比较是否相同。
方法一:
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
#从字符串比较是通过ASIIC码比较来切入
min1,max1=min(strs),max(strs)
if min1!="":#strs是不是空的字符串,如果是空的就直接返回""
for i in range(len(min1)):#
if min1[i]!=max1[i]:
return min1[:i]
return min1#此条语句适用于字符串只有一个字符的特殊情况
else:
return ""
方法二:利用zip()函数
这里首先介绍一下zip()函数:
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
我们可以使用 list() 转换来输出列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 *
号操作符,可以将元组解压为列表。
另外,使用zip函数也可以实现同时遍历两个或更多的序列:
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
print('What is your {0}? It is {1}.'.format(q, a))
>>>What is your name? It is lancelot.What is your quest? It is the holy grail.What is your favorite color? It is blue.
思路:
通过zip函数将字符串中的每个单词的相同位置的元素取出来,存放在列表中,然后进一步判断,相同位置的元素是否相等,如果相等就说明是公共前缀,如何判断相等呢,可以利用集合数据类型的自动去除重复元素来去重,如果相等,那么集合长度就是1,反之,则不相等。
ans=""
for i in list(zip(*strs)):#先解压在转换为列表
if len(set(i))==1:#这里是利用了集合去重来做的
ans+=i[0]
else:
break
return ans
执行用时:
40 ms
内存消耗:
15 MB