LeetCode 49 字母異位詞分組

2021-09-13 12:22:09 字數 1477 閱讀 9838

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

示例:輸入: [「eat」, 「tea」, 「tan」, 「ate」, 「nat」, 「bat」],

輸出:[

[「ate」,「eat」,「tea」],

[「nat」,「tan」],

[「bat」]

]說明:

所有輸入均為小寫字母。

不考慮答案輸出的順序。

這道題的意思就是把含有相同字母的單詞歸類而已,思路其實是挺清晰的。首先建立乙個list,並加入第乙個字串s。

接下倆,我先將它的索引儲存由字典順序排好序記為另乙個字串s』,之後開始遍歷後面的字串s1,以同樣的方法,先以字典順序排好存為另乙個字串s1』,然後與之前那個比較,如果s』與s1』相等了,那麼我把s1加入到list中,儲存s1的索引,再遍歷另一種型別的時候就不會再重複了。遍歷完再把list加進res中。

最後經過兩次遍歷,可以把含相同字母的歸類好啦。

當然了,這個是笨方法,時間複雜度為o(n^2)。在改進中我會改乙個更聰明的。

class solution 

setindex=new hashset<>();

//建立乙個索引,儲存被訪問儲存過的字串位址

int i=0;

while(ilist=new arraylist<>();

list.add(s);

//先從第乙個開始

if(index.contains(i))

index.add(i++);

char currs=s.tochararray();

arrays.sort(currs);

//這個就是s『

string sorteds=new string(currs);

for(int c=i;c這個題目其實沒有什麼難點,不過就是轉換來轉換去很麻煩,一不小心就不知道自己在比的是什麼了。就像寫一半去上廁所回來,不由驚嘆那兩個字,畢竟有四個變數需要處理了呀。

這個方法是國外論壇中乙個大神的方法,雖然有弊端但是特別巧妙,處理小範圍的資料是完全可以的。

這位大神將a-z的26個字母分別用26個質數表示,然後儲存在hashmap中,然後即使再怎麼換順序,這些字母的乘積永遠都是一樣的。這個就是最巧妙的地方了,結合了質數的性質。膜拜。我還是那個想得到常規方法的人。

不過很雞肋的是,一旦字母多了,乘積會爆呀!所以說,應對字母不太多的情況,這個絕對是個好方法。

可以想另一種方法,那就是查表呀,雖然思路和上面差不多,但是用hash表的話直接能儲存位址和字元,就更加方便啦。

class solution

return new arraylist<>(map.values());

}}

那麼這樣子時間複雜度就可以降到了o(n*m)啦

思考這種問題,常規的方法當然可以,但是複雜度太高了,真的需要考慮一下其他的方法,雖然能做,但是時間瀕臨超時,還是需要繼續改進的。

[1]

LeetCode49 字母異位詞分組

給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 所有輸入均為小寫字母。不考慮答案輸出的順序。設定乙個map向量,專門用來統計字串中,所有字元出現的...

LeetCode 49 字母異位詞分組

給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。示例 輸入 eat tea tan ate nat bat 輸出 ate eat tea nat tan bat 說明 此題輸入的是乙個字串陣列,遍歷該陣列,然後將每個字串排序,排序後的字串作為 鍵 存入雜湊表,對應的...

leetcode 49 字母異位詞分組

leetcode 49.字母異位詞分組 給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。演算法1 根據字典序排序後相同的兩個字串是字母異位詞 將字串陣列中的每個字串進行排序,排序後相同的字串被分到相同的組別 演算法在輸入規模較大的情況下超時 演算法2 對於字串列表中...