题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z
。
方法一:水平扫描法
思路
首先,我们将描述一种查找一组字符串的最长公共前缀 LCP(S_1 \ldots S_n)LCP(S1…Sn) 的简单方法。 我们将会用到这样的结论:
LCP(S_1 \ldots S_n) = LCP(LCP(LCP(S_1, S_2),S_3),\ldots S_n)LCP(S1…Sn)=LCP(LCP(LCP(S1,S2),S3),…Sn)
代码
扫描二维码关注公众号,回复:
6036970 查看本文章
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs)==0:
return ""
prefix=strs[0]
for i in range(0,len(strs)):
while(strs[i].find(prefix)!=0):
prefix=prefix[0:len(prefix)-1]
if(len(prefix)==0):return ""
return prefix
方法二:排序
利用python的max()和min(),在Python里字符串是可以比较的,按照ascII值排,举例abb, aba,abac,最大为abb,最小为aba。所以只需要比较最大最小的公共前缀就是整个数组的公共前缀
代码
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs: return ""
s1 = min(strs)
s2 = max(strs)
for i,x in enumerate(s1):
if x != s2[i]:
return s2[:i]
return s1
方法三:分治
思想
这个算法的思路来自于LCP操作的结合律。 我们可以发现: LCP(S_1 \ldots S_n) = LCP(LCP(S_1 \ldots S_k), LCP (S_{k+1} \ldots S_n))LCP(S1…Sn)=LCP(LCP(S1…Sk),LCP(Sk+1…Sn)) ,其中 LCP(S_1 \ldots S_n)LCP(S1…Sn) 是字符串 [S_1 \ldots S_n][S1…Sn] 的最长公共前缀,1 < k < n1<k<n。
分治:先分后合并
代码
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs)==0:
return ""
return self.CommonPrefix(strs,0,len(strs)-1)
def CommonPrefix(self,strs,l,r):
if l==r:
return strs[int(l)]
else:
mid=(l+r)//2
lcpLeft=self.CommonPrefix(strs,l,mid)
lcpRight=self.CommonPrefix(strs,mid+1,r)
return self.Prefix(lcpLeft,lcpRight)
def Prefix(self,left,right):
min_=min(len(left),len(right))
for i in range(min_):
if left[i]!=right[i]:
return left[0:i]
return left[0:min_]