leetcode 14. longest-common-prefix 最长公共前缀 python3

时间:2020-6-19

题目地址:https://leetcode-cn.com/problems/longest-common-prefix/

题目难度:Easy

题目描述:

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

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

示例 1:

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

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

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


思路1:遍历-纵向扫描

还有横向扫描从前往后来两两找最长公共前缀

代码段1:通过

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if(len(strs) <= 1): return "".join(strs)
        result = ""
        max_number = min(len(i) for i in strs)
        for i in range(max_number):
            for j in range(len(strs)):
                if strs[0][i] != strs[j][i]:
                    return "".join(result)
            result += strs[0][i]
        return "".join(result)

总结:

  1. 一开始以为双层for循环又要超时呢
  2. 哈哈哈 简直了 暴力法+面向测试编程,流下了没有技术含量的泪
  3. 这个看起来比较优雅,但是时间和空间也不比我的好
class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs: return ""
        for i in range(len(strs[0])):
            c = strs[0][i]
            if any(i == len(strs[j]) or strs[j][i] != c for j in range(1, len(strs))):
                return strs[0][:i]
        return strs[0]

思路2:使用python的特性,取每一个单词的同一位置的字符,判断是否相同

代码段2:通过

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        res = ""
        for temp in zip(*strs):
            a = set(temp)
            if len(a) == 1:
                res += temp[0]
            else:
                break
        return res

总结:

  1. *号和zip用的太骚了
  2. 在变量前加单星号表示将元组(列表、集合)拆分为单个元素。双星号同上,区别是目标为字典,字典前加单星号的话可以得到“键”。

思路3:这个排序和枚举用的太6了

代码段3:通过

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs: return ""
        s1 = min(strs)
        s2 = max(strs)
        for i, x in enumerate(s1):
            if x != s2[i]:
                return s2[:i]
        return s1

总结:

  1. max()和min(),在Python里字符串是可以比较的,按照ascII值排

其他方法:分治、二分查找

你可能感兴趣的:(leetcode,leetcode,python)