题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母 a-z 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题
class Solution(object):
#1、垂直扫描法
def longestCommonPrefix(self, strs):
if len(strs)==0: #提示越界后添加的校验
return ""
else:
numStr=len(strs)
for i in range(len(strs[0])):
tmp_str=strs[0][i]
flag=0
for j in range(1,numStr):
if i>=len(strs[j]) or strs[j][i] <> tmp_str:
return strs[0][0:i]
return strs[0]
#2、水平扫描
def longestCommonPrefix(self, strs):
if len(strs)==0:
return ""
prefix=strs[0]
numstr=len(strs)
for j in range(1,numstr):
while(strs[j].find(prefix)!=0): #如果不是其他字符串的前缀
prefix=prefix[0:len(prefix)-1] #prefix从尾部去掉一个字符
if not prefix:
return ""
return prefix
#3、二分查找,将第一个字符串最长可能前缀二分处理
#判断是否是前缀,取不到i
def longestCommonPrefix(self, strs):
def isCommonPrefix(strs, i):
prefix=strs[0][0:i]
for str in strs:
if str[0:i]<>prefix:
return False
return True
#特殊情况越界处理
if len(strs)==0 or strs is None:
return ""
#最短字符字符串长度
min_len=len(strs[0])
for str in strs[1:-1]:
if len(str)<min_len:
min_len=len(str)
low =1
high=min_len
while(low<=high):
mid=(low+high)/2
if isCommonPrefix(strs,mid):
low=mid+1
else:
high=mid-1
return strs[0][0:(low+high)/2]
'''
#分治
def longestCommonPrefix(self,strs):
def find(strs, l, r):
if l==r:
return strs[l]
else:
mid=(l+r)/2
lcpLeft=find(strs,0,mid)
lcpRight=find(strs,mid+1,r)
return commonPrefix(lcpLeft, lcpRight)
def commonPrefix(s1,s2):
min_len=min(len(s1),len(s2))
for i in range(min_len):
if s1[i]<>s2[i]:
return s1[0:i]
return s1[0:min_len]
if strs is None or len(strs)==0:
return ""
else:
return find(strs,0,len(strs)-1)
这篇博客详细介绍了如何解决LeetCode上的‘最长公共前缀’问题,提供了三种不同的解题方法:垂直扫描法、水平扫描法和二分查找法。通过示例代码展示每种方法的实现思路,并对特殊情况进行了边界处理。
926

被折叠的 条评论
为什么被折叠?



