題目:
字母異位詞分組(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...