1、自己的想法 # 横向扫描
记录单词前缀,随着匹配的单词越来越多,公共前缀越来越少
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0: # 处理空值
return ""
start, end=0,len(strs[0]) # 记录开始和结束的位置
for sub in strs:
end=min(end,len(sub))
pre = strs[0][start:end]
temp=sub[start:end]
if(pre!=temp): # 如果前缀不同
for i in range(start,end): #查找前缀相同的位置
if(pre[i] != temp[i]):
end = i
break
return strs[0][start:end]
2、纵向扫描
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ""
end=0
length = len(strs[0])
count = len(strs)
for i in range(0,length): # 从第一个字符串的第一个字符开始遍历
c = strs[0][i]
for j in range(0,count): # 从第一个字符串开始遍历
if i == len(strs[j]) or c != strs[j][i]:
end=i
return strs[0][0:end]
return strs[0]
3、分而治之(需要多看看递归)
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
def lcp(start, end): # 终止条件
if (start == end): # 两边相同
return strs[start]
mid = (start + end) // 2
lcpleft, lcpright = lcp(start, mid), lcp(mid+1,end) # 递归,分成两部分继续匹配
minlength=min(len(lcpleft),len(lcpright)) # 对比
for i in range(0,minlength):
if lcpleft[i]!=lcpright[i]:
return lcpleft[:i]
return lcpleft[:minlength]
return "" if not strs else lcp(0,len(strs)-1)
4、二分查找
有时间再看...