LSGO——LeetCode实战(数组系列):14题 最长公共前缀(Longest Common Prefix)

原题:

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:

输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。

解法一(并联扫描法):

先获取最小的字符串。遍历列表strs的每个字符串,不断比较这些字符串的同一位置的字符,如果相同则继续比较下一位,不同则返回刚刚已经比较过的字符。

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if strs==[]:
            return ""
        elif len(strs) ==1:
            return strs[0]
        ans = min(strs, key=len)
        if ans=="":
            return ""
        for i in range(len(ans)):
            for j in range(len(strs)-1):
                if strs[j][i] != strs[j + 1][i]:
                    return ans[:i]
        return ans

解法二:扫描法

程序一

以第一个字符串为样本,去和strs[1:]的所有字符串进行比较,如果相同则直接返回结果,如果不同则将第一个字符串进行pop操作直到相同,接着继续和后面的字符串进行比较。
说白了就是一个优先处理的思想,我先让前面的n个都存在一个公共最长前缀,之后再与后面的字符串求公共最长前缀。

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs) == 0:
            return ""
        prefix = strs[0]
        for i in range(len(strs)):
            while strs[i].find(prefix) !=0:  # 判断是否存在这个字符串,不存在就进行while操作
                prefix = prefix[:len(prefix) - 1]
                if prefix == "":
                    return ""
        return prefix

程序二

程序二在时间复杂度上进行了一些优化。在多次测试效果下,时间消耗是远低于程序一的。

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs) == 0:
            return ""
        prefix = min(strs,key=len)
        for i in range(len(strs)):
            while strs[i].find(prefix) !=0:  # 判断是否存在这个字符串,不存在就进行while操作
                prefix = prefix[:len(prefix) - 1]
                if prefix == "":
                    return ""
        return prefix
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章