编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
链接:https://leetcode-cn.com/problems/longest-common-prefix
解析
方法1
也是我的笨方法,就是选择一个基准字符串,然后按照前缀顺序去一个一个匹配,这样的时间复杂度达到了O(m*n*N)所以很差
方法2
利用Python的字符串的特性,比如aba,abb,abac三个字符串,ascall码最大的是abb,所以这样的特性其中说明了它比较的过程中也就是有从头开始循环字符串,所以我们可以:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return ""
min_str=min(strs)
max_str=max(strs)
for i,m in enumerate(min_str):
if m!=max_str[i]:
return min_str[:i]
return min_str
方法3
也是利用python中的zip方法,用zip内置方法将字符串左边对齐,然后纵向压缩,然后用set方法去重以后查看字符串长度:
def longestCommonPrefix(self, strs):
if not strs: return ""
ss = list(map(set, zip(*strs))) #因为zip方法最后会返回元祖集合,所以需要用list()
res = ""
for i, x in enumerate(ss):
x = list(x)
if len(x) > 1:
break
res = res + x[0]
return res
拿我们的输入例子来说
["flower","flow","flight"]这个集合用了zip方法以后,就是:
["fff","lll","ooi","wwg"]
所以去重以后就是:
["f","l","oi","wg"]
所以判断长度大于1就表示存在不一样的字母。