由淺入深 字母異位詞分組的四種python寫法

2021-10-06 18:29:01 字數 3148 閱讀 3721

題目:

字母異位詞分組(leetcode49)

給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。

示例:

輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]

輸出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ]

說明:

所有輸入均為小寫字母;不考慮答案輸出的順序。

思路:用排好序的字串作為key(這個key其實是可以認為是這個自字串的一種特徵),對應的排序之前的字串作為追加元素加入到該key對應的列表中,當然要先做一次判斷,判定這個字母組合是否已經存在於字典的keys中。用到的知識點包括dict物件的keys()和.values()方法,字串的.join方法,sorted排序方法,for迴圈遍歷enumerate,列表生成式等等,具體**如下。

實現**一:普通方法

lst =

["eat"

,"tea"

,"tan"

,"ate"

,"nat"

,"bat"

]dct =

for i in lst:

key =

str(

sorted

(i))

if key not

in dct.keys():

dct[key]

=[i]

else

: dct[key]

res =

[val for val in dct.values()]

print

(res)

執行結果如下:

其中,字典dct中的值是:

實現**二:使用字典的get方法
lst =

["eat"

,"tea"

,"tan"

,"ate"

,"nat"

,"bat"

]dct =

for word in lst:

key =

''.join(

sorted

(word)

)# 注意get的用法,第二個引數表示key不存在時的預設值

dct[key]

= dct.get(key,

)+[word]

res =

[val for val in dct.values()]

print

(res)

因為get方法的第二個引數可以指定key不存在的情況下value的預設值,所以可以使得**簡化。

import collections

from collections import defaultdict

strs =

["eat"

,"tea"

,"tan"

,"ate"

,"nat"

,"bat"

]dct = defaultdict(

list

)for s in strs:

count =[0

]*26for i in s:

count[

(ord

(i)-

ord(

'a'))]

+=1#注意key只能是不可變的數值

key =

tuple

(count)

dct[

tuple

(count)

]res =

[val for val in dct.values()]

print

(res)

在這裡,其實建立了乙個26維的向量count,用來記錄每個英文本母出現的次數,並且使用了collections中的defaultdict函式,對字典的value用空的list資料結構進行初始化,使得**可讀性進一步增加。

實現的**四:使用質數生成式

用乙個質數來代表乙個字母,那麼一種字母組合對應質數的乘積是唯一的,可以作為特徵值稱為字典的key。

import math as m

defisprime

(num)

:for i in

range(2

,int

(m.sqrt(num))+

1):if num%i==0:

return

false

return

true

count =

0num =

2prims =

while count<=26:

if isprime(num)

: count +=

1 num +=

1def

codewithprime

(word)

:global prims

code =

1for s in word:

index =

ord(s)

-ord

('a'

) code *= prims[index]

return code

strs =

["eat"

,"tea"

,"tan"

,"ate"

,"nat"

,"bat"

]dct =

for word in strs:

key = codewithprime(word)

dct[key]

= dct.get(key,

)+[word]

res =

[val for val in dct.values()]

print

(res)

[

['eat'

,'tea'

,'ate'],

['tan'

,'nat'],

['bat']]

[finished in

0.1s]

領扣 字母異位詞分組 Python實現

給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 所有輸入均為小寫字母。不考慮答案輸出的順序。import collections class so...

242 有效的字母異位詞 Python

一.題目 給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的乙個字母異位詞。示例 1 輸入 s anagram t nagaram 輸出 true示例 2 輸入 s rat t car 輸出 false說明 你可以假設字串只包含小寫字母。高階 如果輸入字串包含 unicode 字元怎麼...

242 有效的字母異位詞 python

題目 給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的字母異位詞。輸入 s anagram t nagaram 輸出 true 輸入 s rat t car 輸出 falsecollections.defaultdict int 訪問dict中不存在的key值不報錯,預設值為0 cl...