Skip to content

Commit 59d9f7b

Browse files
committed
feat: add solutions to lcci problem: No.10.02
1 parent 838e4e3 commit 59d9f7b

File tree

31 files changed

+245
-103
lines changed

31 files changed

+245
-103
lines changed

lcci/10.02.Group Anagrams/README.md

+71-1
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,92 @@
3030

3131
<!-- 这里可写通用的实现逻辑 -->
3232

33+
遍历字符串,将每个字符串按照字符字典序排序后得到一个新的字符串,将相同的新字符串放在哈希表的同一个 key 对应 value 列表中。
34+
35+
| key | value |
36+
| ------- | ----------------------- |
37+
| `"aet"` | `["eat", "tea", "ate"]` |
38+
| `"ant"` | `["tan", "nat"] ` |
39+
| `"abt"` | `["bat"] ` |
40+
41+
最后返回哈希表的 value 列表即可。
42+
3343
<!-- tabs:start -->
3444

3545
### **Python3**
3646

3747
<!-- 这里可写当前语言的特殊实现逻辑 -->
3848

3949
```python
40-
50+
class Solution:
51+
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
52+
chars = collections.defaultdict(list)
53+
for s in strs:
54+
k = ''.join(sorted(list(s)))
55+
chars[k].append(s)
56+
return list(chars.values())
4157
```
4258

4359
### **Java**
4460

4561
<!-- 这里可写当前语言的特殊实现逻辑 -->
4662

4763
```java
64+
class Solution {
65+
public List<List<String>> groupAnagrams(String[] strs) {
66+
Map<String, List<String>> chars = new HashMap<>();
67+
for (String s : strs) {
68+
char[] t = s.toCharArray();
69+
Arrays.sort(t);
70+
String k = new String(t);
71+
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
72+
}
73+
return new ArrayList<>(chars.values());
74+
}
75+
}
76+
```
77+
78+
### **C++**
79+
80+
```cpp
81+
class Solution {
82+
public:
83+
vector<vector<string>> groupAnagrams(vector<string> &strs) {
84+
unordered_map<string, vector<string>> chars;
85+
for (auto s : strs)
86+
{
87+
string k = s;
88+
sort(k.begin(), k.end());
89+
chars[k].emplace_back(s);
90+
}
91+
vector<vector<string>> res;
92+
for (auto it = chars.begin(); it != chars.end(); ++it)
93+
{
94+
res.emplace_back(it->second);
95+
}
96+
return res;
97+
}
98+
};
99+
```
48100
101+
### **Go**
102+
103+
```go
104+
func groupAnagrams(strs []string) [][]string {
105+
chars := map[string][]string{}
106+
for _, s := range strs {
107+
key := []byte(s)
108+
sort.Slice(key, func(i, j int) bool {
109+
return key[i] < key[j]
110+
})
111+
chars[string(key)] = append(chars[string(key)], s)
112+
}
113+
var res [][]string
114+
for _, v := range chars {
115+
res = append(res, v)
116+
}
117+
return res
118+
}
49119
```
50120

51121
### **...**

lcci/10.02.Group Anagrams/README_EN.md

+67-1
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,84 @@
3535

3636
## Solutions
3737

38+
| key | value |
39+
| ------- | ----------------------- |
40+
| `"aet"` | `["eat", "tea", "ate"]` |
41+
| `"ant"` | `["tan", "nat"] ` |
42+
| `"abt"` | `["bat"] ` |
43+
3844
<!-- tabs:start -->
3945

4046
### **Python3**
4147

4248
```python
43-
49+
class Solution:
50+
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
51+
chars = collections.defaultdict(list)
52+
for s in strs:
53+
k = ''.join(sorted(list(s)))
54+
chars[k].append(s)
55+
return list(chars.values())
4456
```
4557

4658
### **Java**
4759

4860
```java
61+
class Solution {
62+
public List<List<String>> groupAnagrams(String[] strs) {
63+
Map<String, List<String>> chars = new HashMap<>();
64+
for (String s : strs) {
65+
char[] t = s.toCharArray();
66+
Arrays.sort(t);
67+
String k = new String(t);
68+
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
69+
}
70+
return new ArrayList<>(chars.values());
71+
}
72+
}
73+
```
74+
75+
### **C++**
76+
77+
```cpp
78+
class Solution {
79+
public:
80+
vector<vector<string>> groupAnagrams(vector<string> &strs) {
81+
unordered_map<string, vector<string>> chars;
82+
for (auto s : strs)
83+
{
84+
string k = s;
85+
sort(k.begin(), k.end());
86+
chars[k].emplace_back(s);
87+
}
88+
vector<vector<string>> res;
89+
for (auto it = chars.begin(); it != chars.end(); ++it)
90+
{
91+
res.emplace_back(it->second);
92+
}
93+
return res;
94+
}
95+
};
96+
```
4997
98+
### **Go**
99+
100+
```go
101+
func groupAnagrams(strs []string) [][]string {
102+
chars := map[string][]string{}
103+
for _, s := range strs {
104+
key := []byte(s)
105+
sort.Slice(key, func(i, j int) bool {
106+
return key[i] < key[j]
107+
})
108+
chars[string(key)] = append(chars[string(key)], s)
109+
}
110+
var res [][]string
111+
for _, v := range chars {
112+
res = append(res, v)
113+
}
114+
return res
115+
}
50116
```
51117

52118
### **...**
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
vector<vector<string>> groupAnagrams(vector<string> &strs) {
4+
unordered_map<string, vector<string>> chars;
5+
for (auto s : strs)
6+
{
7+
string k = s;
8+
sort(k.begin(), k.end());
9+
chars[k].emplace_back(s);
10+
}
11+
vector<vector<string>> res;
12+
for (auto it = chars.begin(); it != chars.end(); ++it)
13+
{
14+
res.emplace_back(it->second);
15+
}
16+
return res;
17+
}
18+
};

lcci/10.02.Group Anagrams/Solution.go

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
func groupAnagrams(strs []string) [][]string {
2+
chars := map[string][]string{}
3+
for _, s := range strs {
4+
key := []byte(s)
5+
sort.Slice(key, func(i, j int) bool {
6+
return key[i] < key[j]
7+
})
8+
chars[string(key)] = append(chars[string(key)], s)
9+
}
10+
var res [][]string
11+
for _, v := range chars {
12+
res = append(res, v)
13+
}
14+
return res
15+
}
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public List<List<String>> groupAnagrams(String[] strs) {
3+
Map<String, List<String>> chars = new HashMap<>();
4+
for (String s : strs) {
5+
char[] t = s.toCharArray();
6+
Arrays.sort(t);
7+
String k = new String(t);
8+
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
9+
}
10+
return new ArrayList<>(chars.values());
11+
}
12+
}

lcci/10.02.Group Anagrams/Solution.py

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class Solution:
2+
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
3+
chars = collections.defaultdict(list)
4+
for s in strs:
5+
k = ''.join(sorted(list(s)))
6+
chars[k].append(s)
7+
return list(chars.values())

lcof2/剑指 Offer II 033. 变位词组/README.md

+1-4
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,7 @@ class Solution {
8585
char[] t = s.toCharArray();
8686
Arrays.sort(t);
8787
String k = new String(t);
88-
if (!chars.containsKey(k)) {
89-
chars.put(k, new ArrayList<>());
90-
}
91-
chars.get(k).add(s);
88+
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
9289
}
9390
return new ArrayList<>(chars.values());
9491
}

lcof2/剑指 Offer II 033. 变位词组/Solution.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ public List<List<String>> groupAnagrams(String[] strs) {
55
char[] t = s.toCharArray();
66
Arrays.sort(t);
77
String k = new String(t);
8-
if (!chars.containsKey(k)) {
9-
chars.put(k, new ArrayList<>());
10-
}
11-
chars.get(k).add(s);
8+
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
129
}
1310
return new ArrayList<>(chars.values());
1411
}

solution/0000-0099/0040.Combination Sum II/Solution.java

+11-6
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,24 @@ class Solution {
44

55
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
66
Arrays.sort(candidates);
7-
combinationSum(candidates,target,candidates.length-1, new ArrayList<>());
7+
combinationSum(candidates, target, candidates.length - 1, new ArrayList<>());
88
return result;
99
}
1010

11-
private void combinationSum(int[] candidates, int target,int length, List<Integer> integers) {
11+
private void combinationSum(int[] candidates, int target, int length, List<Integer> integers) {
1212
List<Integer> list;
1313
for (int i = length; i >= 0; i--) {
1414
int nc = candidates[i];
15-
if (nc>target || i<length && nc==candidates[i+1]) continue;
15+
if (nc > target || i < length && nc == candidates[i + 1]) {
16+
continue;
17+
}
1618
list = new ArrayList<>(integers);
1719
list.add(nc);
18-
if (nc==target) result.add(list);
19-
else combinationSum(candidates, target - nc, i-1, list);
20+
if (nc == target) {
21+
result.add(list);
22+
} else {
23+
combinationSum(candidates, target - nc, i - 1, list);
24+
}
2025
}
2126
}
22-
}
27+
}

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,7 @@ class Solution {
6767
char[] t = s.toCharArray();
6868
Arrays.sort(t);
6969
String k = new String(t);
70-
if (!chars.containsKey(k)) {
71-
chars.put(k, new ArrayList<>());
72-
}
73-
chars.get(k).add(s);
70+
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
7471
}
7572
return new ArrayList<>(chars.values());
7673
}

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,7 @@ class Solution {
5454
char[] t = s.toCharArray();
5555
Arrays.sort(t);
5656
String k = new String(t);
57-
if (!chars.containsKey(k)) {
58-
chars.put(k, new ArrayList<>());
59-
}
60-
chars.get(k).add(s);
57+
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
6158
}
6259
return new ArrayList<>(chars.values());
6360
}

solution/0000-0099/0049.Group Anagrams/Solution.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ public List<List<String>> groupAnagrams(String[] strs) {
55
char[] t = s.toCharArray();
66
Arrays.sort(t);
77
String k = new String(t);
8-
if (!chars.containsKey(k)) {
9-
chars.put(k, new ArrayList<>());
10-
}
11-
chars.get(k).add(s);
8+
chars.computeIfAbsent(k, key -> new ArrayList<>()).add(s);
129
}
1310
return new ArrayList<>(chars.values());
1411
}
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
11
class Solution {
22
private boolean isConnected = false;
33
private Map<String, List<String>> hs;
4+
45
public List<List<String>> findLadders(String beginWord, String endWord, List<String> wordList) {
56
hs = new HashMap<>(16);
67
List<List<String>> result = new ArrayList<>();
7-
if(!wordList.contains(endWord))
8+
if (!wordList.contains(endWord))
89
return result;
910
HashSet<String> dict = new HashSet<>(wordList);
1011
Set<String> fwd = new HashSet<>();
1112
fwd.add(beginWord);
1213
Set<String> bwd = new HashSet<>();
1314
bwd.add(endWord);
1415
bfs(fwd, bwd, dict, false);
15-
if(!isConnected) return result;
16+
if (!isConnected) return result;
1617
List<String> temp = new ArrayList<>();
1718
temp.add(beginWord);
1819
dfs(result, temp, beginWord, endWord);
1920
return result;
2021
}
21-
private void bfs(Set<String> forward, Set<String> backward, Set<String> dict, boolean swap){
22-
if(forward.isEmpty() || backward.isEmpty()) return;
23-
if(forward.size() > backward.size()){
22+
23+
private void bfs(Set<String> forward, Set<String> backward, Set<String> dict, boolean swap) {
24+
if (forward.isEmpty() || backward.isEmpty()) return;
25+
if (forward.size() > backward.size()) {
2426
bfs(backward, forward, dict, !swap);
2527
return;
2628
}
2729
dict.removeAll(forward);
2830
dict.removeAll(backward);
2931
Set<String> set3 = new HashSet<>();
30-
for(String str : forward)
32+
for (String str : forward)
3133
for (int i = 0; i < str.length(); i++) {
3234
char[] ary = str.toCharArray();
3335
for (char j = 'a'; j <= 'z'; j++) {
@@ -47,18 +49,19 @@ private void bfs(Set<String> forward, Set<String> backward, Set<String> dict, bo
4749
}
4850
}
4951
}
50-
if(!isConnected) bfs(set3, backward, dict, swap);
52+
if (!isConnected) bfs(set3, backward, dict, swap);
5153
}
52-
private void dfs(List<List<String>> result, List<String> temp, String start, String end){
53-
if(start.equals(end)){
54+
55+
private void dfs(List<List<String>> result, List<String> temp, String start, String end) {
56+
if (start.equals(end)) {
5457
result.add(new ArrayList<>(temp));
5558
return;
5659
}
57-
if(!hs.containsKey(start)) return;
58-
for(String s : hs.get(start)){
60+
if (!hs.containsKey(start)) return;
61+
for (String s : hs.get(start)) {
5962
temp.add(s);
6063
dfs(result, temp, s, end);
61-
temp.remove(temp.size()-1);
64+
temp.remove(temp.size() - 1);
6265
}
6366
}
6467
}

0 commit comments

Comments
 (0)