LeetCode 14 最长公共前缀 Python3

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、二分查找

有时间再看...

猜你喜欢

转载自blog.csdn.net/mxxxkuku/article/details/109677737
今日推荐