Skip to content

Commit 8d168ed

Browse files
committed
feat: add solutions to lc problem: No.0049
No.0049.Group Anagrams
1 parent 17dcb2f commit 8d168ed

File tree

6 files changed

+275
-125
lines changed

6 files changed

+275
-125
lines changed

solution/0000-0099/0049.Group Anagrams/README.md

Lines changed: 131 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:哈希表**
49+
4850
1. 遍历字符串,对每个字符串按照**字符字典序**排序,得到一个新的字符串。
4951
2. 以新字符串为 `key``[str]``value`,存入哈希表当中(`HashMap<String, List<String>>`)。
5052
3. 后续遍历得到相同 `key` 时,将其加入到对应的 `value` 当中即可。
@@ -59,6 +61,14 @@
5961

6062
最后返回哈希表的 `value` 列表即可。
6163

64+
时间复杂度 $O(n\times k\times \log k)$。其中 $n$ 和 $k$ 分别是字符串数组的长度和字符串的最大长度。
65+
66+
**方法二:计数**
67+
68+
我们也可以将方法一中的排序部分改为计数,也就是说,将每个字符串 $s$ 中的字符以及出现的次数作为 `key`,将字符串 $s$ 作为 `value` 存入哈希表当中。
69+
70+
时间复杂度 $O(n\times (k + C))$。其中 $n$ 和 $k$ 分别是字符串数组的长度和字符串的最大长度,而 $C$ 是字符集的大小,本题中 $C = 26$。
71+
6272
<!-- tabs:start -->
6373

6474
### **Python3**
@@ -68,11 +78,23 @@
6878
```python
6979
class Solution:
7080
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
71-
chars = defaultdict(list)
81+
d = defaultdict(list)
82+
for s in strs:
83+
k = ''.join(sorted(s))
84+
d[k].append(s)
85+
return list(d.values())
86+
```
87+
88+
```python
89+
class Solution:
90+
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
91+
d = defaultdict(list)
7292
for s in strs:
73-
k = ''.join(sorted(list(s)))
74-
chars[k].append(s)
75-
return list(chars.values())
93+
cnt = [0] * 26
94+
for c in s:
95+
cnt[ord(c) - ord('a')] += 1
96+
d[tuple(cnt)].append(s)
97+
return list(d.values())
7698
```
7799

78100
### **Java**
@@ -82,18 +104,119 @@ class Solution:
82104
```java
83105
class Solution {
84106
public List<List<String>> groupAnagrams(String[] strs) {
85-
Map<String, List<String>> chars = new HashMap<>();
107+
Map<String, List<String>> d = new HashMap<>();
86108
for (String s : strs) {
87109
char[] t = s.toCharArray();
88110
Arrays.sort(t);
89-
String k = new String(t);
90-
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
111+
String k = String.valueOf(t);
112+
d.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
91113
}
92-
return new ArrayList<>(chars.values());
114+
return new ArrayList<>(d.values());
93115
}
94116
}
95117
```
96118

119+
```java
120+
class Solution {
121+
public List<List<String>> groupAnagrams(String[] strs) {
122+
Map<String, List<String>> d = new HashMap<>();
123+
for (String s : strs) {
124+
int[] cnt = new int[26];
125+
for (int i = 0; i < s.length(); ++i) {
126+
++cnt[s.charAt(i) - 'a'];
127+
}
128+
StringBuilder sb = new StringBuilder();
129+
for (int i = 0; i < 26; ++i) {
130+
if (cnt[i] > 0) {
131+
sb.append((char) ('a' + i)).append(cnt[i]);
132+
}
133+
}
134+
String k = sb.toString();
135+
d.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
136+
}
137+
return new ArrayList<>(d.values());
138+
}
139+
}
140+
```
141+
142+
### **C++**
143+
144+
```cpp
145+
class Solution {
146+
public:
147+
vector<vector<string>> groupAnagrams(vector<string>& strs) {
148+
unordered_map<string, vector<string>> d;
149+
for (auto& s : strs) {
150+
string k = s;
151+
sort(k.begin(), k.end());
152+
d[k].emplace_back(s);
153+
}
154+
vector<vector<string>> ans;
155+
for (auto& [_, v] : d) ans.emplace_back(v);
156+
return ans;
157+
}
158+
};
159+
```
160+
161+
```cpp
162+
class Solution {
163+
public:
164+
vector<vector<string>> groupAnagrams(vector<string>& strs) {
165+
unordered_map<string, vector<string>> d;
166+
for (auto& s : strs) {
167+
int cnt[26] = {0};
168+
for (auto& c : s) ++cnt[c - 'a'];
169+
string k;
170+
for (int i = 0; i < 26; ++i) {
171+
if (cnt[i]) {
172+
k += 'a' + i;
173+
k += to_string(cnt[i]);
174+
}
175+
}
176+
d[k].emplace_back(s);
177+
}
178+
vector<vector<string>> ans;
179+
for (auto& [_, v] : d) ans.emplace_back(v);
180+
return ans;
181+
}
182+
};
183+
```
184+
185+
### **Go**
186+
187+
```go
188+
func groupAnagrams(strs []string) (ans [][]string) {
189+
d := map[string][]string{}
190+
for _, s := range strs {
191+
t := []byte(s)
192+
sort.Slice(t, func(i, j int) bool { return t[i] < t[j] })
193+
k := string(t)
194+
d[k] = append(d[k], s)
195+
}
196+
for _, v := range d {
197+
ans = append(ans, v)
198+
}
199+
return
200+
}
201+
```
202+
203+
```go
204+
func groupAnagrams(strs []string) (ans [][]string) {
205+
d := map[[26]int][]string{}
206+
for _, s := range strs {
207+
cnt := [26]int{}
208+
for _, c := range s {
209+
cnt[c-'a']++
210+
}
211+
d[cnt] = append(d[cnt], s)
212+
}
213+
for _, v := range d {
214+
ans = append(ans, v)
215+
}
216+
return
217+
}
218+
```
219+
97220
### **TypeScript**
98221

99222
```ts
@@ -122,47 +245,6 @@ function groupAnagrams(strs: string[]): string[][] {
122245
}
123246
```
124247

125-
### **C++**
126-
127-
```cpp
128-
class Solution {
129-
public:
130-
vector<vector<string>> groupAnagrams(vector<string>& strs) {
131-
unordered_map<string, vector<string>> chars;
132-
for (auto s : strs) {
133-
string k = s;
134-
sort(k.begin(), k.end());
135-
chars[k].emplace_back(s);
136-
}
137-
vector<vector<string>> res;
138-
for (auto it = chars.begin(); it != chars.end(); ++it) {
139-
res.emplace_back(it->second);
140-
}
141-
return res;
142-
}
143-
};
144-
```
145-
146-
### **Go**
147-
148-
```go
149-
func groupAnagrams(strs []string) [][]string {
150-
chars := map[string][]string{}
151-
for _, s := range strs {
152-
key := []byte(s)
153-
sort.Slice(key, func(i, j int) bool {
154-
return key[i] < key[j]
155-
})
156-
chars[string(key)] = append(chars[string(key)], s)
157-
}
158-
var res [][]string
159-
for _, v := range chars {
160-
res = append(res, v)
161-
}
162-
return res
163-
}
164-
```
165-
166248
### **Rust**
167249

168250
```rust

0 commit comments

Comments
 (0)