Skip to content

Commit 54f98b3

Browse files
committed
feat: add solutions to lc problem: No.1794
No.1794.Count Pairs of Equal Substrings With Minimum Difference
1 parent f42cc9a commit 54f98b3

File tree

6 files changed

+260
-2
lines changed

6 files changed

+260
-2
lines changed

solution/1700-1799/1794.Count Pairs of Equal Substrings With Minimum Difference/README.md

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,116 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:贪心 + 哈希表**
52+
53+
题目实际上要我们找到一个最小的下标 $i$ 和一个最大的下标 $j$,使得 $firstString[i]$ 与 $secondString[j]$ 相等,且 $i - j$ 的值是所有满足条件的下标对中最小的。
54+
55+
因此,我们先用哈希表 `last` 记录 $secondString$ 中每个字符最后一次出现的下标,然后遍历 $firstString$,对于每个字符 $c$,如果 $c$ 在 $secondString$ 中出现过,则计算 $i - last[c]$,如果 $i - last[c]$ 的值小于当前最小值,则更新最小值,同时更新答案为 1;如果 $i - last[c]$ 的值等于当前最小值,则答案加 1。
56+
57+
时间复杂度 $O(m + n)$,空间复杂度 $O(C)$。其中 $m$ 和 $n$ 分别是 $firstString$ 和 $secondString$ 的长度,而 $C$ 是字符集的大小。本题中 $C = 26$。
58+
5159
<!-- tabs:start -->
5260

5361
### **Python3**
5462

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

5765
```python
58-
66+
class Solution:
67+
def countQuadruples(self, firstString: str, secondString: str) -> int:
68+
last = {c: i for i, c in enumerate(secondString)}
69+
ans, mi = 0, inf
70+
for i, c in enumerate(firstString):
71+
if c in last:
72+
t = i - last[c]
73+
if mi > t:
74+
mi = t
75+
ans = 1
76+
elif mi == t:
77+
ans += 1
78+
return ans
5979
```
6080

6181
### **Java**
6282

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

6585
```java
86+
class Solution {
87+
public int countQuadruples(String firstString, String secondString) {
88+
int[] last = new int[26];
89+
for (int i = 0; i < secondString.length(); ++i) {
90+
last[secondString.charAt(i) - 'a'] = i + 1;
91+
}
92+
int ans = 0, mi = 1 << 30;
93+
for (int i = 0; i < firstString.length(); ++i) {
94+
int j = last[firstString.charAt(i) - 'a'];
95+
if (j > 0) {
96+
int t = i - j;
97+
if (mi > t) {
98+
mi = t;
99+
ans = 1;
100+
} else if (mi == t) {
101+
++ans;
102+
}
103+
}
104+
}
105+
return ans;
106+
}
107+
}
108+
```
109+
110+
### **C++**
111+
112+
```cpp
113+
class Solution {
114+
public:
115+
int countQuadruples(string firstString, string secondString) {
116+
int last[26] = {0};
117+
for (int i = 0; i < secondString.size(); ++i) {
118+
last[secondString[i] - 'a'] = i + 1;
119+
}
120+
int ans = 0, mi = 1 << 30;
121+
for (int i = 0; i < firstString.size(); ++i) {
122+
int j = last[firstString[i] - 'a'];
123+
if (j) {
124+
int t = i - j;
125+
if (mi > t) {
126+
mi = t;
127+
ans = 1;
128+
} else if (mi == t) {
129+
++ans;
130+
}
131+
}
132+
}
133+
return ans;
134+
}
135+
};
136+
```
66137
138+
### **Go**
139+
140+
```go
141+
func countQuadruples(firstString string, secondString string) (ans int) {
142+
last := [26]int{}
143+
for i, c := range secondString {
144+
last[c-'a'] = i + 1
145+
}
146+
mi := 1 << 30
147+
for i, c := range firstString {
148+
j := last[c-'a']
149+
if j > 0 {
150+
t := i - j
151+
if mi > t {
152+
mi = t
153+
ans = 1
154+
} else if mi == t {
155+
ans++
156+
}
157+
}
158+
}
159+
return
160+
}
67161
```
68162

69163
### **...**

solution/1700-1799/1794.Count Pairs of Equal Substrings With Minimum Difference/README_EN.md

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,99 @@
4747
### **Python3**
4848

4949
```python
50-
50+
class Solution:
51+
def countQuadruples(self, firstString: str, secondString: str) -> int:
52+
last = {c: i for i, c in enumerate(secondString)}
53+
ans, mi = 0, inf
54+
for i, c in enumerate(firstString):
55+
if c in last:
56+
t = i - last[c]
57+
if mi > t:
58+
mi = t
59+
ans = 1
60+
elif mi == t:
61+
ans += 1
62+
return ans
5163
```
5264

5365
### **Java**
5466

5567
```java
68+
class Solution {
69+
public int countQuadruples(String firstString, String secondString) {
70+
int[] last = new int[26];
71+
for (int i = 0; i < secondString.length(); ++i) {
72+
last[secondString.charAt(i) - 'a'] = i + 1;
73+
}
74+
int ans = 0, mi = 1 << 30;
75+
for (int i = 0; i < firstString.length(); ++i) {
76+
int j = last[firstString.charAt(i) - 'a'];
77+
if (j > 0) {
78+
int t = i - j;
79+
if (mi > t) {
80+
mi = t;
81+
ans = 1;
82+
} else if (mi == t) {
83+
++ans;
84+
}
85+
}
86+
}
87+
return ans;
88+
}
89+
}
90+
```
91+
92+
### **C++**
93+
94+
```cpp
95+
class Solution {
96+
public:
97+
int countQuadruples(string firstString, string secondString) {
98+
int last[26] = {0};
99+
for (int i = 0; i < secondString.size(); ++i) {
100+
last[secondString[i] - 'a'] = i + 1;
101+
}
102+
int ans = 0, mi = 1 << 30;
103+
for (int i = 0; i < firstString.size(); ++i) {
104+
int j = last[firstString[i] - 'a'];
105+
if (j) {
106+
int t = i - j;
107+
if (mi > t) {
108+
mi = t;
109+
ans = 1;
110+
} else if (mi == t) {
111+
++ans;
112+
}
113+
}
114+
}
115+
return ans;
116+
}
117+
};
118+
```
56119
120+
### **Go**
121+
122+
```go
123+
func countQuadruples(firstString string, secondString string) (ans int) {
124+
last := [26]int{}
125+
for i, c := range secondString {
126+
last[c-'a'] = i + 1
127+
}
128+
mi := 1 << 30
129+
for i, c := range firstString {
130+
j := last[c-'a']
131+
if j > 0 {
132+
t := i - j
133+
if mi > t {
134+
mi = t
135+
ans = 1
136+
} else if mi == t {
137+
ans++
138+
}
139+
}
140+
}
141+
return
142+
}
57143
```
58144

59145
### **...**
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int countQuadruples(string firstString, string secondString) {
4+
int last[26] = {0};
5+
for (int i = 0; i < secondString.size(); ++i) {
6+
last[secondString[i] - 'a'] = i + 1;
7+
}
8+
int ans = 0, mi = 1 << 30;
9+
for (int i = 0; i < firstString.size(); ++i) {
10+
int j = last[firstString[i] - 'a'];
11+
if (j) {
12+
int t = i - j;
13+
if (mi > t) {
14+
mi = t;
15+
ans = 1;
16+
} else if (mi == t) {
17+
++ans;
18+
}
19+
}
20+
}
21+
return ans;
22+
}
23+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func countQuadruples(firstString string, secondString string) (ans int) {
2+
last := [26]int{}
3+
for i, c := range secondString {
4+
last[c-'a'] = i + 1
5+
}
6+
mi := 1 << 30
7+
for i, c := range firstString {
8+
j := last[c-'a']
9+
if j > 0 {
10+
t := i - j
11+
if mi > t {
12+
mi = t
13+
ans = 1
14+
} else if mi == t {
15+
ans++
16+
}
17+
}
18+
}
19+
return
20+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int countQuadruples(String firstString, String secondString) {
3+
int[] last = new int[26];
4+
for (int i = 0; i < secondString.length(); ++i) {
5+
last[secondString.charAt(i) - 'a'] = i + 1;
6+
}
7+
int ans = 0, mi = 1 << 30;
8+
for (int i = 0; i < firstString.length(); ++i) {
9+
int j = last[firstString.charAt(i) - 'a'];
10+
if (j > 0) {
11+
int t = i - j;
12+
if (mi > t) {
13+
mi = t;
14+
ans = 1;
15+
} else if (mi == t) {
16+
++ans;
17+
}
18+
}
19+
}
20+
return ans;
21+
}
22+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def countQuadruples(self, firstString: str, secondString: str) -> int:
3+
last = {c: i for i, c in enumerate(secondString)}
4+
ans, mi = 0, inf
5+
for i, c in enumerate(firstString):
6+
if c in last:
7+
t = i - last[c]
8+
if mi > t:
9+
mi = t
10+
ans = 1
11+
elif mi == t:
12+
ans += 1
13+
return ans

0 commit comments

Comments
 (0)