45
45
46
46
<!-- 这里可写通用的实现逻辑 -->
47
47
48
+ ** 方法一:哈希表**
49
+
48
50
1 . 遍历字符串,对每个字符串按照** 字符字典序** 排序,得到一个新的字符串。
49
51
2 . 以新字符串为 ` key ` ,` [str] ` 为 ` value ` ,存入哈希表当中(` HashMap<String, List<String>> ` )。
50
52
3 . 后续遍历得到相同 ` key ` 时,将其加入到对应的 ` value ` 当中即可。
59
61
60
62
最后返回哈希表的 ` value ` 列表即可。
61
63
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
+
62
72
<!-- tabs:start -->
63
73
64
74
### ** Python3**
68
78
``` python
69
79
class Solution :
70
80
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 )
72
92
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())
76
98
```
77
99
78
100
### ** Java**
@@ -82,18 +104,119 @@ class Solution:
82
104
``` java
83
105
class Solution {
84
106
public List<List<String > > groupAnagrams (String [] strs ) {
85
- Map<String , List<String > > chars = new HashMap<> ();
107
+ Map<String , List<String > > d = new HashMap<> ();
86
108
for (String s : strs) {
87
109
char [] t = s. toCharArray();
88
110
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);
91
113
}
92
- return new ArrayList<> (chars . values());
114
+ return new ArrayList<> (d . values());
93
115
}
94
116
}
95
117
```
96
118
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
+
97
220
### ** TypeScript**
98
221
99
222
``` ts
@@ -122,47 +245,6 @@ function groupAnagrams(strs: string[]): string[][] {
122
245
}
123
246
```
124
247
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
-
166
248
### ** Rust**
167
249
168
250
``` rust
0 commit comments