編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 「」。
示例 1:輸入: [「flower」,「flow」,「flight」] 輸出: 「fl」
示例 2:輸入: [「dog」,「racecar」,「car」] 輸出: 「」
解釋: 輸入不存在公共字首。
說明:所有輸入只包含小寫字母 a-z 。
先說一句題外話,力扣裡這道題標註是【簡單】,但是我做了好久,一些【中等】題我卻分分鐘做出來了,不可信不可信。
做這道題時,首先想到的是雙重迴圈,但在演算法描述上折騰了好久,總算是做粗來了。
class
solution
:def
longestcommonprefix
(self, strs)
->
str:
if strs==
or''
in strs:
return
''if
len(strs)==1
:return strs[0]
minlen=
'1'*
10000
for k in strs:
iflen
(k)<
len(minlen)
:minlen=k
back='';
i=0;
cache=strs[0]
[i];
imp=
'f'while cache==strs[1]
[i]:
for j in strs[1:
]:if cache!=j[i]
: imp=
't'break
if imp==
't':
break
back+=strs[0]
[i] i+=
1if i==
len(minlen)
:break
cache=strs[0]
[i]return back
執行用時 :48 ms, 在所有 python3 提交中擊敗了67.42%的使用者粗糙的演算法在執行時首先就是三連跪,三種特殊情況都沒考慮
1、strs空列表 2、列表裡只有乙個元素 3、最短元素是空串。
#解決方法
if strs==
or''
in strs:
return
''if
len(strs)==1
:return strs[
0]
關於特殊情況這一點我一直想不到什麼好方法,畢竟寫演算法時都是基於一般問題描述和一般例子寫的,沒考慮特殊情況。
暫時來說只能等發現問題再補充修改了。
1、優化**量;2、優化時間。
第一版**23行,時間複雜度大約是o(mn/2)這個級別吧#m是列表長度,n是列表中最短子串的長度。
尋找最短元素的原因是為了在下面的暴力比較中不溢位索引
主要優化的是尋找列表中最短元素,將迴圈和賦值替換成了列表自帶的排序功能,最後進行了一次賦值。總的來說起碼減少了賦值次數吧。
必要的引數賦值沒什麼好辦法縮減,**量縮減不了,最多只能寫一行吧?
class
solution
:def
longestcommonprefix
(self, strs)
->
str:
if strs==
or''
in strs:
return
''if
len(strs)==1
:return strs[0]
strs.sort(key=
len)
minlen=strs[0]
back=
'';i=
0;cache=strs[0]
[i];imp=
'f'while cache==strs[1]
[i]:
for j in strs[1:
]:if cache!=j[i]
:imp=
't';
break
if imp==
't':
break
back+=strs[0]
[i] i+=
1if i==
len(minlen)
:break
cache=strs[0]
[i]return back
執行用時 :44 ms, 在所有 python3 提交中擊敗了82.37%的使用者
class
solution
:def
longestcommonprefix
(self, strs)
->
str:
ifnot strs:
return
"" s1 =
min(strs)
s2 =
max(strs)
for i,x in
enumerate
(s1)
:if x != s2[i]
:return s2[
:i]return s1
使用min()和max()對字串進行比較,得到最大最小值,只求這兩個的公共字首這種方法是真的很棒!非常簡潔優美.方法2
for i,x in enumerate(s1): if x != s2[i]:return s2[:i]
這種比較方式也值得學習.
__這種方法甚至只需要考慮列表為空這一種特殊情況,真的是很棒了
但是加上乙個
f len(strs)==1:return strs[0]
或max()==min()
的判斷可能可以更好的解決特殊情況,提高速度.
class
solution
:def
longestcommonprefix
(self, strs):if
not strs:
return
"" ss =
list
(map
(set
,zip
(*strs)))
res =
""for i, x in
enumerate
(ss)
: x =
list
(x)if
len(x)
>1:
break
res = res + x[0]
return res
ss = list(map(set, zip(*strs)))
這一句是將列表strs裡的所有元素一一對應地打包成元組.
例項:求最長公共字首,所以對zip物件的每個元素set去重然後得到新列表,遍歷一遍,元素長度>1就證明這一項就不是公共字首部分了.ls=['asdfghjkl','asz','asdzaa'] print(list(zip(*ls)))
結果是:[(『a』, 『a』, 『a』), (『s』, 『s』, 『s』), (『d』, 『z』, 『d』)]
最長公共字首(力扣)
2020.10.13繼續堅持每天一道演算法題,從簡單到難題,一步乙個腳印,腳踏實地,希望每天都如此,今天的題目是最長公共字首,開始沒有懂,自己有查了一遍zip 函式,這個函式在python中好用下面讓我們先來看看題把 編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例 ...
力扣最長公共字首理解
注意直觀上想應該是構建乙個準備最後返回的指標,然後這個指標指向的陣列的長度取決於字串陣列中最短的那個字串的長度,但是這樣會很麻煩,所以不妨直接對原陣列操作。即由於返回的公共部分是每乙個元素即每乙個字串都共有的,所以不妨直接取strs 0 操作,即找到strs公共部分後給strs 0 這個字串加上 0...
力扣之最長公共字首
編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 我的思路是取陣列第一項為最初的值,然後和其他的各項進行,比較,然後得出公共字首。var longestcommonprefix function strs else common common.substr 0,j if c...