Skip to content

Commit fd76dff

Browse files
authored
feat: add solutions to lc problem: No.3703 (#4768)
1 parent 70d6eae commit fd76dff

File tree

6 files changed

+344
-10
lines changed

6 files changed

+344
-10
lines changed

solution/3700-3799/3703.Remove K-Balanced Substrings/README.md

Lines changed: 119 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,32 +162,146 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3700-3799/3703.Re
162162

163163
<!-- solution:start -->
164164

165-
### 方法一
165+
### 方法一:栈
166+
167+
我们用一个栈来维护当前字符串的状态。栈中的每个元素是一个二元组,表示某个字符及其连续出现的次数。
168+
169+
遍历字符串中的每个字符:
170+
171+
- 如果栈不为空且栈顶元素的字符与当前字符相同,则将栈顶元素的计数加一。
172+
- 否则,将当前字符和计数 1 作为一个新元素压入栈中。
173+
- 如果当前字符是 `')'`,且栈中至少有两个元素,且栈顶元素的计数等于 $k$,且栈顶元素的前一个元素的计数大于等于 $k$,则弹出栈顶元素,并将前一个元素的计数减去 $k$。如果前一个元素的计数变为 0,则也将其弹出。
174+
175+
遍历结束后,栈中剩下的元素即为最终字符串的状态。我们将这些元素按顺序连接起来,得到结果字符串。
176+
177+
时间复杂度 $O(n)$,空间复杂度 $O(n)$,其中 $n$ 是字符串 $s$ 的长度。
166178

167179
<!-- tabs:start -->
168180

169181
#### Python3
170182

171183
```python
172-
184+
class Solution:
185+
def removeSubstring(self, s: str, k: int) -> str:
186+
stk = []
187+
for c in s:
188+
if stk and stk[-1][0] == c:
189+
stk[-1][1] += 1
190+
else:
191+
stk.append([c, 1])
192+
if c == ")" and len(stk) > 1 and stk[-1][1] == k and stk[-2][1] >= k:
193+
stk.pop()
194+
stk[-1][1] -= k
195+
if stk[-1][1] == 0:
196+
stk.pop()
197+
return "".join(c * v for c, v in stk)
173198
```
174199

175200
#### Java
176201

177202
```java
178-
203+
class Solution {
204+
public String removeSubstring(String s, int k) {
205+
List<int[]> stk = new ArrayList<>();
206+
for (char c : s.toCharArray()) {
207+
if (!stk.isEmpty() && stk.get(stk.size() - 1)[0] == c) {
208+
stk.get(stk.size() - 1)[1] += 1;
209+
} else {
210+
stk.add(new int[]{c, 1});
211+
}
212+
if (c == ')' && stk.size() > 1) {
213+
int[] top = stk.get(stk.size() - 1);
214+
int[] prev = stk.get(stk.size() - 2);
215+
if (top[1] == k && prev[1] >= k) {
216+
stk.remove(stk.size() - 1);
217+
prev[1] -= k;
218+
if (prev[1] == 0) {
219+
stk.remove(stk.size() - 1);
220+
}
221+
}
222+
}
223+
}
224+
StringBuilder sb = new StringBuilder();
225+
for (int[] pair : stk) {
226+
for (int i = 0; i < pair[1]; i++) {
227+
sb.append((char) pair[0]);
228+
}
229+
}
230+
return sb.toString();
231+
}
232+
}
179233
```
180234

181235
#### C++
182236

183237
```cpp
184-
238+
class Solution {
239+
public:
240+
string removeSubstring(string s, int k) {
241+
vector<pair<char, int>> stk;
242+
for (char c : s) {
243+
if (!stk.empty() && stk.back().first == c) {
244+
stk.back().second += 1;
245+
} else {
246+
stk.emplace_back(c, 1);
247+
}
248+
if (c == ')' && stk.size() > 1) {
249+
auto& top = stk.back();
250+
auto& prev = stk[stk.size() - 2];
251+
if (top.second == k && prev.second >= k) {
252+
stk.pop_back();
253+
prev.second -= k;
254+
if (prev.second == 0) {
255+
stk.pop_back();
256+
}
257+
}
258+
}
259+
}
260+
string res;
261+
for (auto& p : stk) {
262+
res.append(p.second, p.first);
263+
}
264+
return res;
265+
}
266+
};
185267
```
186268
187269
#### Go
188270
189271
```go
190-
272+
func removeSubstring(s string, k int) string {
273+
type pair struct {
274+
ch byte
275+
count int
276+
}
277+
stk := make([]pair, 0)
278+
for i := 0; i < len(s); i++ {
279+
c := s[i]
280+
if len(stk) > 0 && stk[len(stk)-1].ch == c {
281+
stk[len(stk)-1].count++
282+
} else {
283+
stk = append(stk, pair{c, 1})
284+
}
285+
if c == ')' && len(stk) > 1 {
286+
top := &stk[len(stk)-1]
287+
prev := &stk[len(stk)-2]
288+
if top.count == k && prev.count >= k {
289+
stk = stk[:len(stk)-1]
290+
prev.count -= k
291+
if prev.count == 0 {
292+
stk = stk[:len(stk)-1]
293+
}
294+
}
295+
}
296+
}
297+
res := make([]byte, 0)
298+
for _, p := range stk {
299+
for i := 0; i < p.count; i++ {
300+
res = append(res, p.ch)
301+
}
302+
}
303+
return string(res)
304+
}
191305
```
192306

193307
<!-- tabs:end -->

solution/3700-3799/3703.Remove K-Balanced Substrings/README_EN.md

Lines changed: 119 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,32 +157,146 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3700-3799/3703.Re
157157

158158
<!-- solution:start -->
159159

160-
### Solution 1
160+
### Solution 1: Stack
161+
162+
We use a stack to maintain the current state of the string. Each element in the stack is a pair representing a character and its consecutive count.
163+
164+
Traverse each character in the string:
165+
166+
- If the stack is not empty and the character of the top element matches the current character, increment the count of the top element.
167+
- Otherwise, push the current character with count 1 as a new element onto the stack.
168+
- If the current character is `')'`, and there are at least two elements in the stack, and the count of the top element equals $k$, and the count of the previous element is greater than or equal to $k$, then pop the top element and subtract $k$ from the count of the previous element. If the count of the previous element becomes 0, pop it as well.
169+
170+
After traversal, the remaining elements in the stack represent the final state of the string. We concatenate these elements in order to get the result string.
171+
172+
The time complexity is $O(n)$ and the space complexity is $O(n)$, where $n$ is the length of string $s$.
161173

162174
<!-- tabs:start -->
163175

164176
#### Python3
165177

166178
```python
167-
179+
class Solution:
180+
def removeSubstring(self, s: str, k: int) -> str:
181+
stk = []
182+
for c in s:
183+
if stk and stk[-1][0] == c:
184+
stk[-1][1] += 1
185+
else:
186+
stk.append([c, 1])
187+
if c == ")" and len(stk) > 1 and stk[-1][1] == k and stk[-2][1] >= k:
188+
stk.pop()
189+
stk[-1][1] -= k
190+
if stk[-1][1] == 0:
191+
stk.pop()
192+
return "".join(c * v for c, v in stk)
168193
```
169194

170195
#### Java
171196

172197
```java
173-
198+
class Solution {
199+
public String removeSubstring(String s, int k) {
200+
List<int[]> stk = new ArrayList<>();
201+
for (char c : s.toCharArray()) {
202+
if (!stk.isEmpty() && stk.get(stk.size() - 1)[0] == c) {
203+
stk.get(stk.size() - 1)[1] += 1;
204+
} else {
205+
stk.add(new int[]{c, 1});
206+
}
207+
if (c == ')' && stk.size() > 1) {
208+
int[] top = stk.get(stk.size() - 1);
209+
int[] prev = stk.get(stk.size() - 2);
210+
if (top[1] == k && prev[1] >= k) {
211+
stk.remove(stk.size() - 1);
212+
prev[1] -= k;
213+
if (prev[1] == 0) {
214+
stk.remove(stk.size() - 1);
215+
}
216+
}
217+
}
218+
}
219+
StringBuilder sb = new StringBuilder();
220+
for (int[] pair : stk) {
221+
for (int i = 0; i < pair[1]; i++) {
222+
sb.append((char) pair[0]);
223+
}
224+
}
225+
return sb.toString();
226+
}
227+
}
174228
```
175229

176230
#### C++
177231

178232
```cpp
179-
233+
class Solution {
234+
public:
235+
string removeSubstring(string s, int k) {
236+
vector<pair<char, int>> stk;
237+
for (char c : s) {
238+
if (!stk.empty() && stk.back().first == c) {
239+
stk.back().second += 1;
240+
} else {
241+
stk.emplace_back(c, 1);
242+
}
243+
if (c == ')' && stk.size() > 1) {
244+
auto& top = stk.back();
245+
auto& prev = stk[stk.size() - 2];
246+
if (top.second == k && prev.second >= k) {
247+
stk.pop_back();
248+
prev.second -= k;
249+
if (prev.second == 0) {
250+
stk.pop_back();
251+
}
252+
}
253+
}
254+
}
255+
string res;
256+
for (auto& p : stk) {
257+
res.append(p.second, p.first);
258+
}
259+
return res;
260+
}
261+
};
180262
```
181263
182264
#### Go
183265
184266
```go
185-
267+
func removeSubstring(s string, k int) string {
268+
type pair struct {
269+
ch byte
270+
count int
271+
}
272+
stk := make([]pair, 0)
273+
for i := 0; i < len(s); i++ {
274+
c := s[i]
275+
if len(stk) > 0 && stk[len(stk)-1].ch == c {
276+
stk[len(stk)-1].count++
277+
} else {
278+
stk = append(stk, pair{c, 1})
279+
}
280+
if c == ')' && len(stk) > 1 {
281+
top := &stk[len(stk)-1]
282+
prev := &stk[len(stk)-2]
283+
if top.count == k && prev.count >= k {
284+
stk = stk[:len(stk)-1]
285+
prev.count -= k
286+
if prev.count == 0 {
287+
stk = stk[:len(stk)-1]
288+
}
289+
}
290+
}
291+
}
292+
res := make([]byte, 0)
293+
for _, p := range stk {
294+
for i := 0; i < p.count; i++ {
295+
res = append(res, p.ch)
296+
}
297+
}
298+
return string(res)
299+
}
186300
```
187301

188302
<!-- tabs:end -->
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution {
2+
public:
3+
string removeSubstring(string s, int k) {
4+
vector<pair<char, int>> stk;
5+
for (char c : s) {
6+
if (!stk.empty() && stk.back().first == c) {
7+
stk.back().second += 1;
8+
} else {
9+
stk.emplace_back(c, 1);
10+
}
11+
if (c == ')' && stk.size() > 1) {
12+
auto& top = stk.back();
13+
auto& prev = stk[stk.size() - 2];
14+
if (top.second == k && prev.second >= k) {
15+
stk.pop_back();
16+
prev.second -= k;
17+
if (prev.second == 0) {
18+
stk.pop_back();
19+
}
20+
}
21+
}
22+
}
23+
string res;
24+
for (auto& p : stk) {
25+
res.append(p.second, p.first);
26+
}
27+
return res;
28+
}
29+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
func removeSubstring(s string, k int) string {
2+
type pair struct {
3+
ch byte
4+
count int
5+
}
6+
stk := make([]pair, 0)
7+
for i := 0; i < len(s); i++ {
8+
c := s[i]
9+
if len(stk) > 0 && stk[len(stk)-1].ch == c {
10+
stk[len(stk)-1].count++
11+
} else {
12+
stk = append(stk, pair{c, 1})
13+
}
14+
if c == ')' && len(stk) > 1 {
15+
top := &stk[len(stk)-1]
16+
prev := &stk[len(stk)-2]
17+
if top.count == k && prev.count >= k {
18+
stk = stk[:len(stk)-1]
19+
prev.count -= k
20+
if prev.count == 0 {
21+
stk = stk[:len(stk)-1]
22+
}
23+
}
24+
}
25+
}
26+
res := make([]byte, 0)
27+
for _, p := range stk {
28+
for i := 0; i < p.count; i++ {
29+
res = append(res, p.ch)
30+
}
31+
}
32+
return string(res)
33+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution {
2+
public String removeSubstring(String s, int k) {
3+
List<int[]> stk = new ArrayList<>();
4+
for (char c : s.toCharArray()) {
5+
if (!stk.isEmpty() && stk.get(stk.size() - 1)[0] == c) {
6+
stk.get(stk.size() - 1)[1] += 1;
7+
} else {
8+
stk.add(new int[]{c, 1});
9+
}
10+
if (c == ')' && stk.size() > 1) {
11+
int[] top = stk.get(stk.size() - 1);
12+
int[] prev = stk.get(stk.size() - 2);
13+
if (top[1] == k && prev[1] >= k) {
14+
stk.remove(stk.size() - 1);
15+
prev[1] -= k;
16+
if (prev[1] == 0) {
17+
stk.remove(stk.size() - 1);
18+
}
19+
}
20+
}
21+
}
22+
StringBuilder sb = new StringBuilder();
23+
for (int[] pair : stk) {
24+
for (int i = 0; i < pair[1]; i++) {
25+
sb.append((char) pair[0]);
26+
}
27+
}
28+
return sb.toString();
29+
}
30+
}

0 commit comments

Comments
 (0)