找出一组字符串的最长公共前缀
解法一:水平扫描
从前往后枚举字符串的每一列,先比较每个字符串相同列的字符(即不同字符串相同下标的字符)然后再进行对下一列的比较。
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
l = len(strs)
if strs == None or l == 0:
return ""
for i in range(len(strs[0])):
c = strs[0][i]
for j in range(1, l):
if len(strs[j]) == i or strs[j][i] != c:
return strs[0][0:i]
return strs[0]
解法二:分治法(解决类似问题的模板)
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs is None or len(strs) == 0:
return ""
return self.findLCP(strs, 0, len(strs) - 1)
def findLCP(self, strs, l, r):
if l == r:
return strs[l]
m = (l + r ) / 2
lPart = self.findLCP(strs, l, m)
rPart = self.findLCP(strs, m + 1, r)
return self.concatLR(lPart, rPart)
def concatLR(self, lPart, rPart):
mmin = min(len(lPart), len(rPart))
for i in range(mmin):
if lPart[i] != rPart[i]:
return lPart[0:i]
return lPart[0:mmin]
解法三:二分查找
S[1...mid] 不是所有串的公共前缀。 这表明对于所有的 j > i S[1..j] 也不是公共前缀,于是我们就可以丢弃后半个查找区间。
S[1...mid] 是所有串的公共前缀。 这表示对于所有的 i < j S[1..i] 都是可行的公共前缀,因为我们要找最长的公共前缀,所以我们
可以把前半个查找区间丢弃。
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
l = len(strs)
if strs == None or l == 0:
return ""
minLen = float('inf')
for i in range(l):
minLen = min(minLen, len(strs[i]))
low = 1
high = minLen
while low <= high:
middle = (low + high) / 2
if self.isCommon(strs, middle):
low = middle + 1
else:
high = middle - 1
res = (low + high)/2
return strs[0][0:res]
def isCommon(self, strs, ll):
for i in range(ll):
for j in range(1, len(strs)):
if strs[j][i] != strs[0][i]:
return False
return True
这里low和high的设置==不太懂
low = 1
high = minLen