力扣 242 有效的字母異位詞

2021-10-06 12:50:50 字數 2481 閱讀 2182

給定兩個字串 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 類似雜湊 還是重複問題 首先需要明白題的意思,其實就是比較兩個字串中字母是否相同,在相同的情況下比較該字元...