Longest Common Prefix

自己写的

==思路很简单,首先设置好i,j,其中i是用来表示列表中字符串的序号,j使用来表示字符串中的序号,如果两两字符串相等,那么j+1接着比较下一个字符,如果两两字符不相等,则输出当前的前缀字符串。
==Time complexity : O(S) , where S is the sum of all characters in all strings.,空间复杂度O(1),时间复杂度我想应该是这样的,因为字符串的个数是常数级的,字符串的长度也是常数级的,因此时间复杂度也是常数级的。

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs) == 0:
            return ''
        if len(strs) ==1:
            return strs[0]
        str = ''
        i, j = 0, 0
        while i + 1 < len(strs) and j < len(strs[i]) and j < len(strs[i+1]):
            if strs[i][j] == strs[i + 1][j]:
                i += 1
                if i == len(strs) - 1:
                    str += strs[0][j]
                    i = 0
                    j += 1
            else:
                return str
        return str

Horizontal scanning

==这个是Leetcode Solution里的第一个方法,我把它从Java改成python,思路刚好是倒着来的,直接把第一个字符串作为前缀,如果第二个字符串可以查询不到第一个字符串,那么去除前缀的最后一个字符再比较,直到不满足while循环,也就是查询到了,而且是返回的序号是0,那么再比较下一个字符串,依次这样。

==Time complexity : O(S) , where S is the sum of all characters in all strings.

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs) == 0:
            return ''
        prefix = strs[0]
        for i in range(1, len(strs)):
            while strs[i].find(prefix) !=0:
                prefix = prefix[:-1]
                if not prefix: 
                    return ''
        return prefix

==有一个问题,java里面的indexof返回的是字符串中查询到前缀的第一个字符的序号,也就是0.在python里面使用的是find返回字符串查询到的前缀的第一个字符的序号,即0,如果查询不到则返回-1,如果查询到的前缀不在最前面,返回相应的序号。

#查询到了,但不是最前面
'acc'.find('c')
Out[26]: 1
#查询不到
'compare'.find('come')
Out[30]: -1
#查询到了,是在最前面,这也是我们需要的结果
'compare'.find('com')
Out[31]: 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值