vault backup: 2022-09-06 16:52:42
This commit is contained in:
parent
0a3691373f
commit
77b57a8131
112
OJ notes/pages/Leetcode Group-Anagrams.md
Normal file
112
OJ notes/pages/Leetcode Group-Anagrams.md
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
# Leetcode Group-Anagrams
|
||||||
|
|
||||||
|
2022-09-06 16:46
|
||||||
|
|
||||||
|
> ##### Data structures:
|
||||||
|
>
|
||||||
|
> #DS #array #hash_table
|
||||||
|
>
|
||||||
|
> ##### Difficulty:
|
||||||
|
>
|
||||||
|
> #coding_problem #difficulty-medium
|
||||||
|
>
|
||||||
|
> ##### Additional tags:
|
||||||
|
>
|
||||||
|
> #leetcode
|
||||||
|
>
|
||||||
|
> ##### Revisions:
|
||||||
|
>
|
||||||
|
> N/A
|
||||||
|
|
||||||
|
##### Links:
|
||||||
|
|
||||||
|
- [Link to problem](https://leetcode.com/problems/group-anagrams/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
Given an array of strings `strs`, group **the anagrams** together. You can return the answer in **any order**.
|
||||||
|
|
||||||
|
An **Anagram** is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
|
||||||
|
**Example 1:**
|
||||||
|
|
||||||
|
**Input:** strs = ["eat","tea","tan","ate","nat","bat"]
|
||||||
|
**Output:** [["bat"],["nat","tan"],["ate","eat","tea"]]
|
||||||
|
|
||||||
|
**Example 2:**
|
||||||
|
|
||||||
|
**Input:** strs = [""]
|
||||||
|
**Output:** [[""]]
|
||||||
|
|
||||||
|
**Example 3:**
|
||||||
|
|
||||||
|
**Input:** strs = ["a"]
|
||||||
|
**Output:** [["a"]]
|
||||||
|
|
||||||
|
#### Constraints
|
||||||
|
|
||||||
|
- `1 <= strs.length <= 104`
|
||||||
|
- `0 <= strs[i].length <= 100`
|
||||||
|
- `strs[i]` consists of lowercase English letters.
|
||||||
|
|
||||||
|
### Thoughts
|
||||||
|
|
||||||
|
> [!summary]
|
||||||
|
> This is a #hash_table problem.
|
||||||
|
|
||||||
|
This one can be solved simply using two-way hash tables, consisting two hash tables:
|
||||||
|
- ana2id: turn anagram into an id
|
||||||
|
- id2str: turn id into strings that has the anagrams
|
||||||
|
|
||||||
|
The one problem is hashing vectors / arrays. Here we use
|
||||||
|
CPP-style initialization of C's array.
|
||||||
|
|
||||||
|
> [!tip]
|
||||||
|
> CPP-style initialization of C array #tip
|
||||||
|
> ```cpp
|
||||||
|
> array<int, 26> ana = {};
|
||||||
|
> ```
|
||||||
|
|
||||||
|
Note that vectors doesn't work in unordered hash maps,
|
||||||
|
unless we use custom hash functions.
|
||||||
|
|
||||||
|
### Solution
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
class Solution {
|
||||||
|
public:
|
||||||
|
vector<vector<string>> groupAnagrams(vector<string> &strs) {
|
||||||
|
// using to hash maps for 2-way conversion
|
||||||
|
map<array<int, 26>, int> ana2id;
|
||||||
|
// this one is the answer returned.
|
||||||
|
vector<vector<string>> id2str;
|
||||||
|
|
||||||
|
int id = 0;
|
||||||
|
for (string str : strs) {
|
||||||
|
// Use aggregate initialization to default to 0.
|
||||||
|
array<int, 26> ana = {};
|
||||||
|
|
||||||
|
for (char s : str) {
|
||||||
|
ana[s - 'a']++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ana2id.find(ana) == ana2id.end()) {
|
||||||
|
// Not in the map.
|
||||||
|
ana2id[ana] = id;
|
||||||
|
id2str.push_back({});
|
||||||
|
id2str.back().push_back(str);
|
||||||
|
id++;
|
||||||
|
} else {
|
||||||
|
// in the map, append it to id2str
|
||||||
|
id2str[ana2id[ana]].push_back(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return id2str;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
Loading…
Reference in a new issue