Skip to content

Commit 49a38f6

Browse files
committed
feat: add solutions to lc problem: No.1208
No.1208.Get Equal Substrings Within Budget
1 parent c4f62b9 commit 49a38f6

File tree

16 files changed

+584
-28
lines changed

16 files changed

+584
-28
lines changed

solution/1200-1299/1208.Get Equal Substrings Within Budget/README.md

+129-1
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,150 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58+
前缀和 + 二分查找。
59+
5860
<!-- tabs:start -->
5961

6062
### **Python3**
6163

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

6466
```python
65-
67+
class Solution:
68+
def equalSubstring(self, s: str, t: str, maxCost: int) -> int:
69+
n = len(s)
70+
presum = [0] * (n + 1)
71+
for i in range(n):
72+
presum[i + 1] = presum[i] + abs(ord(s[i]) - ord(t[i]))
73+
left, right = 0, n
74+
75+
def check(l):
76+
i = 0
77+
while i + l - 1 < n:
78+
j = i + l - 1
79+
if presum[j + 1] - presum[i] <= maxCost:
80+
return True
81+
i += 1
82+
return False
83+
84+
while left < right:
85+
mid = (left + right + 1) >> 1
86+
if check(mid):
87+
left = mid
88+
else:
89+
right = mid - 1
90+
return left
6691
```
6792

6893
### **Java**
6994

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

7297
```java
98+
class Solution {
99+
public int equalSubstring(String s, String t, int maxCost) {
100+
int n = s.length();
101+
int[] presum = new int[n + 1];
102+
for (int i = 0; i < n; ++i) {
103+
presum[i + 1] = presum[i] + Math.abs(s.charAt(i) - t.charAt(i));
104+
}
105+
int left = 0, right = n;
106+
while (left < right) {
107+
int mid = (left + right + 1) >>> 1;
108+
if (check(mid, presum, maxCost, n)) {
109+
left = mid;
110+
} else {
111+
right = mid - 1;
112+
}
113+
}
114+
return left;
115+
}
116+
117+
private boolean check(int l, int[] s, int maxCost, int n) {
118+
int i = 0;
119+
while (i + l - 1 < n) {
120+
int j = i + l - 1;
121+
if (s[j + 1] - s[i] <= maxCost) {
122+
return true;
123+
}
124+
++i;
125+
}
126+
return false;
127+
}
128+
}
129+
```
130+
131+
### **C++**
132+
133+
```cpp
134+
class Solution {
135+
public:
136+
int equalSubstring(string s, string t, int maxCost) {
137+
int n = s.size();
138+
vector<int> presum(n + 1);
139+
for (int i = 0; i < n; ++i) presum[i + 1] = presum[i] + abs(s[i] - t[i]);
140+
int left = 0, right = n;
141+
while (left < right)
142+
{
143+
int mid = left + right + 1 >> 1;
144+
if (check(mid, presum, maxCost, n)) left = mid;
145+
else right = mid - 1;
146+
}
147+
return left;
148+
}
149+
150+
bool check(int l, vector<int>& s, int maxCost, int n) {
151+
int i = 0;
152+
while (i + l - 1 < n)
153+
{
154+
int j = i + l - 1;
155+
if (s[j + 1] - s[i] <= maxCost) return true;
156+
++i;
157+
}
158+
return false;
159+
}
160+
};
161+
```
73162

163+
### **Go**
164+
165+
```go
166+
func equalSubstring(s string, t string, maxCost int) int {
167+
n := len(s)
168+
presum := make([]int, n+1)
169+
for i, c := range s {
170+
presum[i+1] = presum[i] + abs(int(c)-int(t[i]))
171+
}
172+
173+
left, right := 0, n
174+
check := func(l int) bool {
175+
i := 0
176+
for i+l-1 < n {
177+
j := i + l - 1
178+
if presum[j+1]-presum[i] <= maxCost {
179+
return true
180+
}
181+
i++
182+
}
183+
return false
184+
}
185+
for left < right {
186+
mid := (left + right + 1) >> 1
187+
if check(mid) {
188+
left = mid
189+
} else {
190+
right = mid - 1
191+
}
192+
}
193+
return left
194+
}
195+
196+
func abs(x int) int {
197+
if x > 0 {
198+
return x
199+
}
200+
return -x
201+
}
74202
```
75203

76204
### **...**

solution/1200-1299/1208.Get Equal Substrings Within Budget/README_EN.md

+127-1
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,139 @@
5252
### **Python3**
5353

5454
```python
55-
55+
class Solution:
56+
def equalSubstring(self, s: str, t: str, maxCost: int) -> int:
57+
n = len(s)
58+
presum = [0] * (n + 1)
59+
for i in range(n):
60+
presum[i + 1] = presum[i] + abs(ord(s[i]) - ord(t[i]))
61+
left, right = 0, n
62+
63+
def check(l):
64+
i = 0
65+
while i + l - 1 < n:
66+
j = i + l - 1
67+
if presum[j + 1] - presum[i] <= maxCost:
68+
return True
69+
i += 1
70+
return False
71+
72+
while left < right:
73+
mid = (left + right + 1) >> 1
74+
if check(mid):
75+
left = mid
76+
else:
77+
right = mid - 1
78+
return left
5679
```
5780

5881
### **Java**
5982

6083
```java
84+
class Solution {
85+
public int equalSubstring(String s, String t, int maxCost) {
86+
int n = s.length();
87+
int[] presum = new int[n + 1];
88+
for (int i = 0; i < n; ++i) {
89+
presum[i + 1] = presum[i] + Math.abs(s.charAt(i) - t.charAt(i));
90+
}
91+
int left = 0, right = n;
92+
while (left < right) {
93+
int mid = (left + right + 1) >>> 1;
94+
if (check(mid, presum, maxCost, n)) {
95+
left = mid;
96+
} else {
97+
right = mid - 1;
98+
}
99+
}
100+
return left;
101+
}
102+
103+
private boolean check(int l, int[] s, int maxCost, int n) {
104+
int i = 0;
105+
while (i + l - 1 < n) {
106+
int j = i + l - 1;
107+
if (s[j + 1] - s[i] <= maxCost) {
108+
return true;
109+
}
110+
++i;
111+
}
112+
return false;
113+
}
114+
}
115+
```
116+
117+
### **C++**
118+
119+
```cpp
120+
class Solution {
121+
public:
122+
int equalSubstring(string s, string t, int maxCost) {
123+
int n = s.size();
124+
vector<int> presum(n + 1);
125+
for (int i = 0; i < n; ++i) presum[i + 1] = presum[i] + abs(s[i] - t[i]);
126+
int left = 0, right = n;
127+
while (left < right)
128+
{
129+
int mid = left + right + 1 >> 1;
130+
if (check(mid, presum, maxCost, n)) left = mid;
131+
else right = mid - 1;
132+
}
133+
return left;
134+
}
135+
136+
bool check(int l, vector<int>& s, int maxCost, int n) {
137+
int i = 0;
138+
while (i + l - 1 < n)
139+
{
140+
int j = i + l - 1;
141+
if (s[j + 1] - s[i] <= maxCost) return true;
142+
++i;
143+
}
144+
return false;
145+
}
146+
};
147+
```
61148

149+
### **Go**
150+
151+
```go
152+
func equalSubstring(s string, t string, maxCost int) int {
153+
n := len(s)
154+
presum := make([]int, n+1)
155+
for i, c := range s {
156+
presum[i+1] = presum[i] + abs(int(c)-int(t[i]))
157+
}
158+
159+
left, right := 0, n
160+
check := func(l int) bool {
161+
i := 0
162+
for i+l-1 < n {
163+
j := i + l - 1
164+
if presum[j+1]-presum[i] <= maxCost {
165+
return true
166+
}
167+
i++
168+
}
169+
return false
170+
}
171+
for left < right {
172+
mid := (left + right + 1) >> 1
173+
if check(mid) {
174+
left = mid
175+
} else {
176+
right = mid - 1
177+
}
178+
}
179+
return left
180+
}
181+
182+
func abs(x int) int {
183+
if x > 0 {
184+
return x
185+
}
186+
return -x
187+
}
62188
```
63189

64190
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
int equalSubstring(string s, string t, int maxCost) {
4+
int n = s.size();
5+
vector<int> presum(n + 1);
6+
for (int i = 0; i < n; ++i) presum[i + 1] = presum[i] + abs(s[i] - t[i]);
7+
int left = 0, right = n;
8+
while (left < right)
9+
{
10+
int mid = left + right + 1 >> 1;
11+
if (check(mid, presum, maxCost, n)) left = mid;
12+
else right = mid - 1;
13+
}
14+
return left;
15+
}
16+
17+
bool check(int l, vector<int>& s, int maxCost, int n) {
18+
int i = 0;
19+
while (i + l - 1 < n)
20+
{
21+
int j = i + l - 1;
22+
if (s[j + 1] - s[i] <= maxCost) return true;
23+
++i;
24+
}
25+
return false;
26+
}
27+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
func equalSubstring(s string, t string, maxCost int) int {
2+
n := len(s)
3+
presum := make([]int, n+1)
4+
for i, c := range s {
5+
presum[i+1] = presum[i] + abs(int(c)-int(t[i]))
6+
}
7+
8+
left, right := 0, n
9+
check := func(l int) bool {
10+
i := 0
11+
for i+l-1 < n {
12+
j := i + l - 1
13+
if presum[j+1]-presum[i] <= maxCost {
14+
return true
15+
}
16+
i++
17+
}
18+
return false
19+
}
20+
for left < right {
21+
mid := (left + right + 1) >> 1
22+
if check(mid) {
23+
left = mid
24+
} else {
25+
right = mid - 1
26+
}
27+
}
28+
return left
29+
}
30+
31+
func abs(x int) int {
32+
if x > 0 {
33+
return x
34+
}
35+
return -x
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution {
2+
public int equalSubstring(String s, String t, int maxCost) {
3+
int n = s.length();
4+
int[] presum = new int[n + 1];
5+
for (int i = 0; i < n; ++i) {
6+
presum[i + 1] = presum[i] + Math.abs(s.charAt(i) - t.charAt(i));
7+
}
8+
int left = 0, right = n;
9+
while (left < right) {
10+
int mid = (left + right + 1) >>> 1;
11+
if (check(mid, presum, maxCost, n)) {
12+
left = mid;
13+
} else {
14+
right = mid - 1;
15+
}
16+
}
17+
return left;
18+
}
19+
20+
private boolean check(int l, int[] s, int maxCost, int n) {
21+
int i = 0;
22+
while (i + l - 1 < n) {
23+
int j = i + l - 1;
24+
if (s[j + 1] - s[i] <= maxCost) {
25+
return true;
26+
}
27+
++i;
28+
}
29+
return false;
30+
}
31+
}

0 commit comments

Comments
 (0)