給定乙個字串陣列,將字母異位片語合在一起。字母異位詞指字母相同,但排列不同的字串。
示例:輸入: [「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 對於字串列表中...