Skip to content

Commit d4e4621

Browse files
committed
feat: update solutions to lc/lcof2 problems
lc No.0893 & lcof2 No.117.Similar String Groups
1 parent 57974d8 commit d4e4621

File tree

11 files changed

+214
-297
lines changed

11 files changed

+214
-297
lines changed

lcof2/剑指 Offer II 117. 相似的字符串/README.md

+37-53
Original file line numberDiff line numberDiff line change
@@ -119,26 +119,17 @@ d[find(a)] = distance
119119
```python
120120
class Solution:
121121
def numSimilarGroups(self, strs: List[str]) -> int:
122-
n = len(strs)
123-
p = list(range(n))
124-
125122
def find(x):
126123
if p[x] != x:
127124
p[x] = find(p[x])
128125
return p[x]
129-
130-
def check(a, b):
131-
cnt = 0
132-
for i, c in enumerate(a):
133-
if c != b[i]:
134-
cnt += 1
135-
return cnt <= 2
136-
126+
127+
n, l = len(strs), len(strs[0])
128+
p = list(range(n))
137129
for i in range(n):
138130
for j in range(i + 1, n):
139-
if check(strs[i], strs[j]):
131+
if sum(strs[i][k] != strs[j][k] for k in range(l)) <= 2:
140132
p[find(i)] = find(j)
141-
142133
return sum(i == find(i) for i in range(n))
143134
```
144135

@@ -198,30 +189,27 @@ class Solution {
198189
class Solution {
199190
public:
200191
vector<int> p;
192+
201193
int numSimilarGroups(vector<string>& strs) {
202194
int n = strs.size();
203-
for (int i = 0; i < n; ++i) p.push_back(i);
195+
p.resize(n);
196+
for (int i = 0; i < n; ++i) p[i] = i;
204197
for (int i = 0; i < n; ++i)
205-
{
206198
for (int j = i + 1; j < n; ++j)
207-
{
208199
if (check(strs[i], strs[j]))
209200
p[find(i)] = find(j);
210-
}
211-
}
212-
int res = 0;
201+
int ans = 0;
213202
for (int i = 0; i < n; ++i)
214-
{
215-
if (i == find(i)) ++res;
216-
}
217-
return res;
203+
if (i == find(i))
204+
++ans;
205+
return ans;
218206
}
219207

220208
bool check(string a, string b) {
221209
int cnt = 0;
222-
int n = a.size();
223-
for (int i = 0; i < n; ++i)
224-
if (a[i] != b[i]) ++cnt;
210+
for (int i = 0; i < a.size(); ++i)
211+
if (a[i] != b[i])
212+
++cnt;
225213
return cnt <= 2;
226214
}
227215

@@ -235,46 +223,42 @@ public:
235223
### **Go**
236224
237225
```go
238-
var p []int
239-
240226
func numSimilarGroups(strs []string) int {
241227
n := len(strs)
242-
p = make([]int, n)
243-
for i := 0; i < n; i++ {
228+
p := make([]int, n)
229+
for i := range p {
244230
p[i] = i
245231
}
246-
for i := 0; i < n; i++ {
247-
for j := i + 1; j < n; j++ {
248-
if !check(strs[i], strs[j]) {
249-
continue
232+
check := func(a, b string) bool {
233+
cnt := 0
234+
for i := range a {
235+
if a[i] != b[i] {
236+
cnt++
250237
}
251-
p[find(i)] = find(j)
252238
}
239+
return cnt <= 2
253240
}
254-
res := 0
255-
for i := 0; i < n; i++ {
256-
if i == find(i) {
257-
res++
241+
var find func(x int) int
242+
find = func(x int) int {
243+
if p[x] != x {
244+
p[x] = find(p[x])
258245
}
246+
return p[x]
259247
}
260-
return res
261-
}
262-
263-
func check(a, b string) bool {
264-
cnt, n := 0, len(a)
265248
for i := 0; i < n; i++ {
266-
if a[i] != b[i] {
267-
cnt++
249+
for j := i + 1; j < n; j++ {
250+
if check(strs[i], strs[j]) {
251+
p[find(i)] = find(j)
252+
}
268253
}
269254
}
270-
return cnt <= 2
271-
}
272-
273-
func find(x int) int {
274-
if p[x] != x {
275-
p[x] = find(p[x])
255+
ans := 0
256+
for i := 0; i < n; i++ {
257+
if i == find(i) {
258+
ans++
259+
}
276260
}
277-
return p[x]
261+
return ans
278262
}
279263
```
280264

lcof2/剑指 Offer II 117. 相似的字符串/Solution.cpp

+10-13
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,27 @@
11
class Solution {
22
public:
33
vector<int> p;
4+
45
int numSimilarGroups(vector<string>& strs) {
56
int n = strs.size();
6-
for (int i = 0; i < n; ++i) p.push_back(i);
7+
p.resize(n);
8+
for (int i = 0; i < n; ++i) p[i] = i;
79
for (int i = 0; i < n; ++i)
8-
{
910
for (int j = i + 1; j < n; ++j)
10-
{
1111
if (check(strs[i], strs[j]))
1212
p[find(i)] = find(j);
13-
}
14-
}
15-
int res = 0;
13+
int ans = 0;
1614
for (int i = 0; i < n; ++i)
17-
{
18-
if (i == find(i)) ++res;
19-
}
20-
return res;
15+
if (i == find(i))
16+
++ans;
17+
return ans;
2118
}
2219

2320
bool check(string a, string b) {
2421
int cnt = 0;
25-
int n = a.size();
26-
for (int i = 0; i < n; ++i)
27-
if (a[i] != b[i]) ++cnt;
22+
for (int i = 0; i < a.size(); ++i)
23+
if (a[i] != b[i])
24+
++cnt;
2825
return cnt <= 2;
2926
}
3027

Original file line numberDiff line numberDiff line change
@@ -1,41 +1,37 @@
1-
var p []int
2-
31
func numSimilarGroups(strs []string) int {
42
n := len(strs)
5-
p = make([]int, n)
6-
for i := 0; i < n; i++ {
3+
p := make([]int, n)
4+
for i := range p {
75
p[i] = i
86
}
9-
for i := 0; i < n; i++ {
10-
for j := i + 1; j < n; j++ {
11-
if !check(strs[i], strs[j]) {
12-
continue
7+
check := func(a, b string) bool {
8+
cnt := 0
9+
for i := range a {
10+
if a[i] != b[i] {
11+
cnt++
1312
}
14-
p[find(i)] = find(j)
1513
}
14+
return cnt <= 2
1615
}
17-
res := 0
18-
for i := 0; i < n; i++ {
19-
if i == find(i) {
20-
res++
16+
var find func(x int) int
17+
find = func(x int) int {
18+
if p[x] != x {
19+
p[x] = find(p[x])
2120
}
21+
return p[x]
2222
}
23-
return res
24-
}
25-
26-
func check(a, b string) bool {
27-
cnt, n := 0, len(a)
2823
for i := 0; i < n; i++ {
29-
if a[i] != b[i] {
30-
cnt++
24+
for j := i + 1; j < n; j++ {
25+
if check(strs[i], strs[j]) {
26+
p[find(i)] = find(j)
27+
}
3128
}
3229
}
33-
return cnt <= 2
34-
}
35-
36-
func find(x int) int {
37-
if p[x] != x {
38-
p[x] = find(p[x])
30+
ans := 0
31+
for i := 0; i < n; i++ {
32+
if i == find(i) {
33+
ans++
34+
}
3935
}
40-
return p[x]
36+
return ans
4137
}

lcof2/剑指 Offer II 117. 相似的字符串/Solution.java

+11-12
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,29 @@ public int numSimilarGroups(String[] strs) {
1414
}
1515
}
1616
}
17-
int res = 0;
17+
int ans = 0;
1818
for (int i = 0; i < n; ++i) {
1919
if (i == find(i)) {
20-
++res;
20+
++ans;
2121
}
2222
}
23-
return res;
23+
return ans;
24+
}
25+
26+
private int find(int x) {
27+
if (p[x] != x) {
28+
p[x] = find(p[x]);
29+
}
30+
return p[x];
2431
}
2532

2633
private boolean check(String a, String b) {
2734
int cnt = 0;
28-
int n = a.length();
29-
for (int i = 0; i < n; ++i) {
35+
for (int i = 0; i < a.length(); ++i) {
3036
if (a.charAt(i) != b.charAt(i)) {
3137
++cnt;
3238
}
3339
}
3440
return cnt <= 2;
3541
}
36-
37-
private int find(int x) {
38-
if (p[x] != x) {
39-
p[x] = find(p[x]);
40-
}
41-
return p[x];
42-
}
4342
}
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
11
class Solution:
22
def numSimilarGroups(self, strs: List[str]) -> int:
3-
n = len(strs)
4-
p = list(range(n))
5-
63
def find(x):
74
if p[x] != x:
85
p[x] = find(p[x])
96
return p[x]
107

11-
def check(a, b):
12-
cnt = 0
13-
for i, c in enumerate(a):
14-
if c != b[i]:
15-
cnt += 1
16-
return cnt <= 2
17-
8+
n, l = len(strs), len(strs[0])
9+
p = list(range(n))
1810
for i in range(n):
1911
for j in range(i + 1, n):
20-
if check(strs[i], strs[j]):
12+
if sum(strs[i][k] != strs[j][k] for k in range(l)) <= 2:
2113
p[find(i)] = find(j)
22-
2314
return sum(i == find(i) for i in range(n))

0 commit comments

Comments
 (0)