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值排

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章