14. Longest Common Prefix

https://leetcode.com/problems/longest-common-prefix/description/
题目大意:给一系列字符串strs,找最长的共同前缀
这题与最长公共子串,最长公共子序列的区别在于另两者都是两个串之间的比对,而本题是多个串匹配,限制更多,相互影响,只要有两个串之间不存在公共,那所有串都不存在。
解题思路1:水平搜索。先找strs[0]和strs[1]的共同前缀(注意前缀必须是从头开始的连续子串),以strs[0]为基准prefix,在strs[1]中找是否存在prefix前缀,若不存在,prefix尾部截去一个字符,成为新的prefix,继续在strs[1]中找,直到prefix为空串,此时strs[0]与strs[1]不存在共同前缀,推知所有的strs[i]不存在共同前缀。
若strs[0]与strs[1]有共同前缀,则记录为prefix,然后在strs[2]中继续找是否存在prefix前缀,以此类推,直到在所有串中找一遍。

代码:

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        n = len(strs)
        if n == 0:
            return ""
        prefix = strs[0]
        for i in range(1, n):
            while strs[i].find(prefix) != 0:  #用find方法找子串
                prefix = prefix[:len(prefix)-1]
                if prefix == "":
                    return prefix
        return prefix

思路2:垂直搜索。与上面水平搜索的区别在于,水平是每个串之间比对一遍,垂直是以strs[0]为基准,对其每个字符,在所有串之间比对。好处在于如果有一个最短串位于strs[n-1],长度为p,水平搜索就要遍历所有的串,复杂度为len(strs[0] + strs[1] + ... + strs[n-1])。而垂直搜索最多只遍历所有的串的前p位,复杂度为p * n = len(strs[n-1]) * n,也就是说不用遍历所有的情况。

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        n = len(strs)
        if n == 0:  #边界条件,串数为0时,不存在str[0],需特殊处理
            return ""

        for i in range(0, len(strs[0])):  #对基准串中的每一位
            for j in range(1, n):  #在所有串中寻找
                if len(strs[j]) == i or strs[j][i] != strs[0][i]:  #若找到一位与基准串不符,返回(前一个条件是为了防止越界)
                    return strs[0][:i]
        return strs[0]  #若能走出循环,说明str[0]整个串都符合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值