【Leetcode】【Medium】Group Anagrams

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

  1. For the return value, each inner list's elements must follow the lexicographic order.
  2. All inputs will be in lower-case.

 

解題思路: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 };
相關文章
相關標籤/搜索