力扣第14题“最长公共前缀”(python解决)

题目:

思路:

我开始是想把strs中的每个元素转化为集合中的元素,然后取交集,但是发现对于有相同元素但顺序不同的字符串无法解决(ps同时发现交集是左右左右这样取的)。

然后又是暴力破题,先取出两个字符串,找到公共前缀,用这个公共前缀去和剩余字符串比较。

代码:

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if len(strs)==1 or strs[0]=="":  #如果只有一个字符串,或者第一个字符串为""
            return strs[0]
        left = 0
        right = 1
        temp_list = []
        temp_list1 = []
        if strs[left] =='' or strs[right] =='':
            return ''
        length_r = len(strs[right])
        length_l = len(strs[left])
        length = min(length_l,length_r) 

        i = 0
        while i < length and strs[left][i] == strs[right][i]:
            temp_list.append(strs[left][i])  #找到第一个字符串和第二个字符串的公共前缀
            i +=1
        for element in strs[1:]:  #从第二个元素开始遍历
            if element =='':      #如果有元素为“”,直接return
                return ''
            length = min(len(temp_list),len(element)) #计算公共前缀长还是新的字符串长
            k = 0
            while k<length :
                if temp_list[k] == element[k]: #如果字符串元素相同,k+1
                    k +=1
                else:
                    temp_list1 = temp_list[0:k] #否则就保留相同的字符串元素并清除旧的
                    temp_list = temp_list1[::]
                    temp_list1.clear()
                    break
            else:  #针对公共前缀比elemen长的情况 ["ac","ac","a","a"]这种
                temp_list1 = temp_list[0:k]  
                temp_list = temp_list1[::]
                temp_list1.clear()
        return ''.join(''.join(temp_list))

大神代码:

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        s0 = strs[0]
        for j, c in enumerate(s0): #枚举类型,j是次序(0,len-1),c为对应元素
            for s in strs:
                if j == len(s) or s[j] != c:  #每一行的第j个元素是否相同,同时找到最短的哪一行
                    return s0[:j]
        return s0

作者:灵茶山艾府
链接:https://leetcode.cn/problems/longest-common-prefix/solutions/2801713/jian-dan-ti-jian-dan-zuo-pythonjavaccgoj-478q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

大神的思路是真的简洁啊,感觉自己一直是在暴力破题,根据测试用例反向弥补漏洞,很难一开始就考虑的很全面。一开始我也想到这种矩阵第一列这样去对比,但是就是没有好的实现方式。感觉要换点角度刷题了。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值