時間: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)
總結:
- 一開始以爲雙層for循環又要超時呢
- 哈哈哈 簡直了 暴力法+面向測試編程,流下了沒有技術含量的淚
- 這個看起來比較優雅,但是時間和空間也不比我的好
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
總結:
- *號和zip用的太騷了
- 在變量前加單星號表示將元組(列表、集合)拆分爲單個元素。雙星號同上,區別是目標爲字典,字典前加單星號的話可以得到“鍵”。
思路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
總結:
- max()和min(),在Python裏字符串是可以比較的,按照ascII值排
其他方法:分治、二分查找