Given an array of strings, group anagrams together.數組
For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
Return:spa
[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]
Note:code
解題思路:blog
一、對原字符串進行排序,這樣全部具備相同字符的字符串就獲得了相同的結果。排序
二、使用hash表,key是排序後的字符串,value設置爲結果數組中保存的地址(下標),這樣,找打一個重複字符串就能夠直接放入結果數組中。element
注意:字符串
一、返回結果中,對於相同字符的字符串,要按照字典序進行排序,所以還要多一步排序過程。get
解題步驟:input
一、新建結果數組和hash表;string
二、遍歷輸入的原始字符串集合,對每一個字符串:
(1)排序
(2)在hash中查找,若是找到,則取出value,對應到結果數組中,將原字符串插入;
(3)若是在hash表中沒找到,則:
a. 先在結果二維數組中開闢新的一維數組,用來保存這個新字符組合;
b. 插入當前這個字符串;
c.在hash表中添加記錄;value值是開闢的新數組位置;
三、最後遍歷結果數組,對每一個字數組進行排序;
AC代碼:
1 class Solution { 2 public: 3 vector<vector<string>> groupAnagrams(vector<string>& strs) { 4 vector<vector<string> > ans; 5 unordered_map<string, int> mp; 6 7 for (int i = 0; i < strs.size(); ++i) { 8 string cur(strs[i]); 9 sort(cur.begin(), cur.end()); 10 if (mp.find(cur) != mp.end()) { 11 ans[mp[cur]].push_back(strs[i]); 12 } else { 13 vector<string> tmp(1, strs[i]); 14 ans.push_back(tmp); 15 mp[cur] = ans.size() - 1; 16 } 17 } 18 19 for (int i = 0; i < ans.size(); ++i) { 20 sort(ans[i].begin(), ans[i].end()); 21 } 22 23 return ans; 24 } 25 };