對python亂序字串檢查演算法研究

2021-10-09 06:32:18 字數 2090 閱讀 7942

顯示不同量級的演算法的乙個很好的例子是字串的亂序檢查。亂序字串是指乙個字串只是另乙個字串的重新排列。例如,『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 ...