給定兩個字串 s 和 t ,編寫乙個函式來判斷 t 是否是 s 的字母異位詞(構成字串的字母種類和個數均相同,只不過順序不同)。
可以將兩個字串都轉化為陣列,然後對兩個陣列先進行排序,如果排序後的陣列內容相同,則兩個字串時字母異位體:
public
boolean
isanagram
(string s, string t)
這個解法用來系統內建排序,所以時間複雜度應為o(nlogn),n為s、t中較長字串的長度。
利用雜湊表來統計每個字元出現的頻次,如果每個字元出現的頻次是一樣的,那麼這兩個字串也是字母異位體,為了檢查 t 是否是 s 的重新排列,我們可以計算兩個字串中每個字母的出現次數並進行比較。因為 s 和 t 都只包含 a-z 的字母,所以乙個簡單的 26 位計數器表就足夠了。
我們需要兩個計數器數表進行比較嗎?實際上不是,因為我們可以用乙個計數器表計算 s 字母的頻率,用 t 減少計數器表中的每個字母的計數器,然後檢查計數器是否回到零。
public
boolean
isanagram
(string s, string t)
for(
char c : t.
tochararray()
)for
(int i : counts)
}return
true
;}
這個解法的時間複雜度顯然為o(n),當然如果不用增強for遍歷s、t的char陣列的話,而是用fori同時遍歷s、t陣列,一遍加一遍減的話,時間還可以更快一些「
public
boolean
isanagram
(string s, string t)
int[
] counter =
newint[26
];for(
int i =
0; i < s.
length()
; i++
)for
(int count : counter)
}return
true
;}
下面再做一道這道題目的高階題目,就是力扣第49題字母異位詞分組
給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。
示例:
輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
參照242題的題解1的暴力法來判斷兩個字串是否為字母異位詞,當且僅當它們的排序字串相等時,兩個字串是字母異位詞。維護乙個對映map :,其中每個鍵 k 是乙個排序字串(字母異位詞排序後的字串,比如 [「ate」,「eat」,「tea」] 對應儲存的key為"aet"),每個值是初始輸入的字串列表(如 [「ate」,「eat」,「tea」]),排序後等於 k。如上述示例中
str = [「eat」, 「tea」 ,「tan」, 「ate」, 「nat」, 「bat」],則對應的map為:
map =
遍歷字串陣列中的字串,先將字串轉換為排序後的字串,如果排序後的字串沒有出現過就加入到key中,如果出現過就將其真實未排序的字串新增到該key對應的字串陣列中,最後維護的map的value即最終的陣列即為結果,**實現如下:
public list
>
groupanagrams
(string[
] strs)
hashmap
map =
newhashmap
<
>()
;for
(string s : strs)
map.
get(key)
.add
(s);
}return
newarraylist
(map.
values()
);}
時間複雜度:o(nklogk),其中 n 是 strs 的長度,而 k 是 strs 中字串的最大長度。當我們遍歷每個字串時,外部迴圈具有的複雜度為 o(n)。然後,我們在 o(klogk) 的時間內對每個字串排序。空間複雜度:o(nk),排序儲存在 map 中的全部資訊內容。
參照242題的解法2來判斷兩個字串是否是字母異位體,當且僅當它們的字元計數(每個字元的出現次數)相同時,兩個字串是字母異位詞。
242 有效的字母異位詞
給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的乙個字母異位詞。示例 1 輸入 s anagram t nagaram 輸出 true示例 2 輸入 s rat t car 輸出 false說明 你可以假設字串只包含小寫字母。class solution object def isa...
242 有效的字母異位詞
給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的乙個字母異位詞。示例 1 輸入 s anagram t nagaram 輸出 true 示例 2 輸入 s rat t car 輸出 false 說明 你可以假設字串只包含小寫字母。class solution def isanagra...
242 有效的字母異位詞
給定兩個字串 s 和 t 編寫乙個函式來判斷 t 是否是 s 的乙個字母異位詞。輸入 s anagram t nagaram 輸出 true輸入 s rat t car 輸出 false方法1 類似雜湊 還是重複問題 首先需要明白題的意思,其實就是比較兩個字串中字母是否相同,在相同的情況下比較該字元...