顯示不同量級的演算法的乙個很好的例子是字串的亂序檢查。亂序字串是指乙個字串只是另乙個字串的重新排列。例如,『heart』 和 『earth』 就是亂序字串。『python』 和 『typhon』 也是。為了簡單起見,我們假設所討論的兩個字串具有相等的長度,並且他們由 26 個小寫字母集合組成。我們的目標是寫乙個布林函式,它將兩個字串做引數並返回它們是不是亂序。
解法一:
思路:將兩個字串都轉化成列表,然後遍歷其中乙個,當前元素在另外乙個列表中就把另乙個列表的對應元素移除(防止重複干擾)。不存在就返回false,遍歷完成返回true
str1 =
'hagjen'
str2 =
'ahejng'
deffoo
(str1,str2)
: ls1 =
list
(str1)
ls2 =
list
(str2)
for i in ls1:
if i in ls2:
ls2.remove(i)
else
:return
false
return
true
print
(foo(str1,str2)
)
解法二:
兩個字串也都轉為列表,然後排序當排序後連個列表相等就返回true,否則false
'''
'''str1 =
'hagjen'
str2 =
'ahejng'
deffoo
(str1,str2)
: ls1 =
list
(str1)
.sort(
) ls2 =
list
(str2)
.sort(
)return
true
if ls1==ls2 else
false
print
(foo(str1,str2)
)
演算法複雜度:咋一看完全沒有迴圈,複雜度好像非常低,但是別忘了排序!排序是python內部實現的,它也需要時間消耗,排序的演算法複雜度一般是o(nlog(n)),o(n^2)。所以這種方法不一定比上面的好
解法三
建立兩個長度為26的列表,分別遍歷兩個字串,分別計數,最後兩個列表相同就返回true
def
foo(s1,s2)
: ls1 =
list
(s1)
ls2 =
list
(s2)
count1 =[0
for i in
range(26
)]count2 =[0
for i in
range(26
)]print
(count1)
print
(count2)
for i in ls1:
count1[
ord(i)
-ord
('a')]
+=1for i in ls2:
count2[
ord(i)
-ord
('a')]
+=1return
true
if count1==count2 else
false
print
(foo(
'aacf'
,'cfaa'
))
時間複雜度:由於沒有迴圈巢狀也沒有排序等演算法,時間複雜度為2n+26,即o(n)
**優化:
def
is_simlar
(s1, s2)
:from collections import counter
return counter(s1)
== counter(s2)
亂序字串比較 python
亂序字串是指乙個字串只是另乙個字串的重新排列。例如,heart 和 earth 就是亂序字串。下面的方法是比較連個字串是不是亂序字串,下面應該是演算法複雜度比較小的的了。其他的先排序,然後比較。應該算比較容易想到。但是複雜度會提高。def compilestr a,b s1 0 26 s2 0 26...
亂序字串
給出乙個字串陣列s,找到其中所有的亂序字串 anagram 如果乙個字串是亂序字串,那麼他存在乙個字母集合相同,但順序不同的字串也在s中。所有的字串都只包含小寫字母 對於字串陣列 lint intl inlt code 返回 lint inlt intl 思路 認為每一組亂序字串都有唯一的相同的 h...
亂序字串
給出乙個字串陣列s,找到其中所有的亂序字串 anagram 如果乙個字串是亂序字串,那麼他存在乙個字母集合相同,但順序不同的字串也在s中。所有的字串都只包含小寫字母 樣例1 輸入 lint intl inlt code 輸出 lint inlt intl 樣例 2 輸入 ab ba cd dc e ...