# day_06: Group Anagrams
###### tags: `online_judge`, `python3`
給定一組字串,把具有相同字元(不限順序)的字串分在同一組,並輸出各組字串。
例如 ```eat``` 和 ```tea``` 在同一組。
而 ```eat``` 和 ```eaf``` 則不在同一組。
這題有兩種解法,分別是陣列或排序。
陣列解法是為每個字串建立長度為 26 的 int 陣列。統計其中各個字母的出現次數,並和其他字串的統計比對。例如有字串```aacd```,則其統計陣列為```[2,0,1,1,0,0,...,0]```。
為求加速可以建立 hash table,以字串 ASCII sum 作為 key。免去每次和其餘所有字串統計陣列比對。
但考慮極端情況,若所有字串的 ASCII sum 都重複,而且所有字串都不同組,那麼比對次數將會是 O(N^2)。
排序解法為每個字串先進行排序,並以排序後的字串為 key 建立 hash table。
因為如果兩個字串同有相同的字元,那麼兩個字串排序後必定相同。
例:```eat``` 和 ```tea``` 在排序後都是 ```aet```。
---
## 題目
```
Given an array of strings, group anagrams together.
Example 1:
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
```
---
## 解答
python array version:
```python=
class Solution:
def groupAnagrams(self, strs):
sum_map = {}
str_map = []
str_info_length = 0
str_ans = []
for string in strs:
ascii_map = [0]*27
length = len(string)
i = 0
while i < length:
ascii_map[26] += (ord(string[i])-97)
ascii_map[ord(string[i])-97] += 1
i += 1
if not sum_map.__contains__(ascii_map[26]):
str_map.append(ascii_map)
str_ans.append([string])
sum_map[ascii_map[26]] = []
sum_map[ascii_map[26]].append(str_info_length)
str_info_length += 1
else:
flag = False
for posible_case in sum_map[ascii_map[26]]:
if str_map[posible_case] == ascii_map:
str_ans[posible_case].append(string)
flag = True
break
if flag == False:
str_map.append(ascii_map)
str_ans.append([string])
sum_map[ascii_map[26]].append(str_info_length)
str_info_length += 1
return str_ans
a = Solution()
"""print (a.groupAnagrams(["eat", "eat", "ate"]))"""
"""print (a.groupAnagrams(["eat", "tea", "tan", "ate", "nat", "bat"]))"""
print (a.groupAnagrams(["vow","pam","vic","bee","ken","jay","oft","sue","joy","yuk","sac","mac","inc","big","icy","bus","lob","flo","day","aol","eel","rex","jug","man","cod","mix","guy","ken"]))
```
python sorting version:
```python=
class Solution:
def groupAnagrams(self, strs):
sort_map = {}
ans_length = 0
ans = []
for string in strs:
sorted_string = ""
sorted_string = sorted_string.join(sorted(string))
if sorted_string not in sort_map:
sort_map[sorted_string] = ans_length
ans.append([string])
ans_length += 1
else:
ans[sort_map[sorted_string]].append(string)
return ans
a = Solution()
print (a.groupAnagrams(["eat", "eat", "ate"]))
print (a.groupAnagrams(["eat", "tea", "tan", "ate", "nat", "bat"]))
print (a.groupAnagrams(["vow","pam","vic","bee","ken","jay","oft","sue","joy","yuk","sac","mac","inc","big","icy","bus","lob","flo","day","aol","eel","rex","jug","man","cod","mix","guy","ken"]))
```
---
### 成績
Array version:

Sorting version:

---