1. 程式人生 > >LeetCode】49. Group Anagrams (非雜湊做法)

LeetCode】49. Group Anagrams (非雜湊做法)

傳送門

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”] ] 說明: 所有輸入均為小寫字母。 不考慮答案輸出的順序。

解題思路:

最近在學習字串雜湊演算法,所以去看了一下這個題目,我發現網上大部分都是雜湊做法,而且及其相似!!!但是我發現這個不用雜湊也是可以做的,就是正常的模擬,首先記錄一個結構體 NodeNode ,這個結構體有三個成員 s1(),s2(),id()s1(原字串), s2(排序後字串), id(原字串所在下標), 首先我們將每一個字串進行內部排序(因為 “eat”, “ate”, "tea"排完序之後都是相同的字串 “aet”) , 排完序之後,我們給結構體賦值,然後按照 s2s2

2 進行結構體排序,排完序之後判斷相鄰的兩個結構體 s2s2是否相等,如果相等那麼就將 s1s1 放入結果,最後返回結果集即可。

程式碼如下:

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; } };