LeetCode】49. Group Anagrams (非雜湊做法)
阿新 • • 發佈:2018-12-21
Example: Input: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”], Output: [ [“ate”,“eat”,“tea”], [“nat”,“tan”], [“bat”] ] Note:
All inputs will be in lowercase. The order of your output does not matter.
題目大意:
給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。 示例:
輸入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”], 輸出: [ [“ate”,“eat”,“tea”], [“nat”,“tan”], [“bat”] ] 說明: 所有輸入均為小寫字母。 不考慮答案輸出的順序。
解題思路:
最近在學習字串雜湊演算法,所以去看了一下這個題目,我發現網上大部分都是雜湊做法,而且及其相似!!!但是我發現這個不用雜湊也是可以做的,就是正常的模擬,首先記錄一個結構體 ,這個結構體有三個成員 , 首先我們將每一個字串進行內部排序(因為 “eat”, “ate”, "tea"排完序之後都是相同的字串 “aet”) , 排完序之後,我們給結構體賦值,然後按照 進行結構體排序,排完序之後判斷相鄰的兩個結構體 是否相等,如果相等那麼就將 放入結果,最後返回結果集即可。
程式碼如下:
class Solution {
public:
struct Node{
string s1, s2;
int id;
Node(string a1, string a2, int i) { s1=a1, s2=a2, id=i; }
};
static bool cmp(Node A, Node B) {
if(A.s2==B.s2) return A.id<B.id;
return A.s2<B.s2;
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<Node> v;
for(int i=0; i<strs.size(); i++) {
string t1=strs[i];
sort(t1.begin(), t1.end());
string t="";
for(int j=0; j<t1.length(); j++) t+=t1[j];
v.push_back(Node(strs[i], t, i));
}
sort(v.begin(), v.end(), cmp);
vector<vector<string>> res;
vector<string> ans;
ans.push_back(v[0].s1);
for(int i=1; i<v.size(); i++) {
if(v[i].s2==v[i-1].s2) ans.push_back(v[i].s1);
else {
res.push_back(ans);
ans.clear();
ans.push_back(v[i].s1);
}
}
res.push_back(ans);
for(int i=0; i<res.size(); i++) sort(res[i].begin(), res[i].end());
return res;
}
};