Skip to content

Commit 57966ab

Browse files
committed
feat: add solutions to lc problem: No.1717
No.1717.Maximum Score From Removing Substrings
1 parent 636bed6 commit 57966ab

File tree

9 files changed

+449
-14
lines changed

9 files changed

+449
-14
lines changed

solution/1700-1799/1717.Maximum Score From Removing Substrings/README.md

+152-1
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,173 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61+
不失一般性,可以设 `x >= y`。因此,可以先删除所有 "ab",再删除所有 "ba",获取最终得分 ans。
62+
6163
<!-- tabs:start -->
6264

6365
### **Python3**
6466

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

6769
```python
68-
70+
class Solution:
71+
def maximumGain(self, s: str, x: int, y: int) -> int:
72+
if x < y:
73+
return self.maximumGain(s[::-1], y, x)
74+
ans = 0
75+
stk1, stk2 = [], []
76+
for c in s:
77+
if c != 'b':
78+
stk1.append(c)
79+
else:
80+
if stk1 and stk1[-1] == 'a':
81+
stk1.pop()
82+
ans += x
83+
else:
84+
stk1.append(c)
85+
while stk1:
86+
c = stk1.pop()
87+
if c != 'b':
88+
stk2.append(c)
89+
else:
90+
if stk2 and stk2[-1] == 'a':
91+
stk2.pop()
92+
ans += y
93+
else:
94+
stk2.append(c)
95+
return ans
6996
```
7097

7198
### **Java**
7299

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

75102
```java
103+
class Solution {
104+
public int maximumGain(String s, int x, int y) {
105+
if (x < y) {
106+
return maximumGain(new StringBuilder(s).reverse().toString(), y, x);
107+
}
108+
int ans = 0;
109+
Deque<Character> stk1 = new ArrayDeque<>();
110+
Deque<Character> stk2 = new ArrayDeque<>();
111+
for (char c : s.toCharArray()) {
112+
if (c != 'b') {
113+
stk1.push(c);
114+
} else {
115+
if (!stk1.isEmpty() && stk1.peek() == 'a') {
116+
stk1.pop();
117+
ans += x;
118+
} else {
119+
stk1.push(c);
120+
}
121+
}
122+
}
123+
while (!stk1.isEmpty()) {
124+
char c = stk1.pop();
125+
if (c != 'b') {
126+
stk2.push(c);
127+
} else {
128+
if (!stk2.isEmpty() && stk2.peek() == 'a') {
129+
stk2.pop();
130+
ans += y;
131+
} else {
132+
stk2.push(c);
133+
}
134+
}
135+
}
136+
return ans;
137+
}
138+
}
139+
```
140+
141+
### **C++**
142+
143+
```cpp
144+
class Solution {
145+
public:
146+
int maximumGain(string s, int x, int y) {
147+
if (x < y)
148+
{
149+
reverse(s.begin(), s.end());
150+
return maximumGain(s, y, x);
151+
}
152+
int ans = 0;
153+
stack<char> stk1;
154+
stack<char> stk2;
155+
for (char c : s)
156+
{
157+
if (c != 'b') stk1.push(c);
158+
else
159+
{
160+
if (!stk1.empty() && stk1.top() == 'a')
161+
{
162+
stk1.pop();
163+
ans += x;
164+
}
165+
else stk1.push(c);
166+
}
167+
}
168+
while (!stk1.empty())
169+
{
170+
char c = stk1.top();
171+
stk1.pop();
172+
if (c != 'b') stk2.push(c);
173+
else
174+
{
175+
if (!stk2.empty() && stk2.top() == 'a')
176+
{
177+
stk2.pop();
178+
ans += y;
179+
}
180+
else stk2.push(c);
181+
}
182+
}
183+
return ans;
184+
}
185+
};
186+
```
76187
188+
### **Go**
189+
190+
```go
191+
func maximumGain(s string, x int, y int) int {
192+
if x < y {
193+
t := []rune(s)
194+
for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 {
195+
t[i], t[j] = t[j], t[i]
196+
}
197+
return maximumGain(string(t), y, x)
198+
}
199+
ans := 0
200+
var stk1 []byte
201+
var stk2 []byte
202+
for i := range s {
203+
if s[i] != 'b' {
204+
stk1 = append(stk1, s[i])
205+
} else {
206+
if len(stk1) > 0 && stk1[len(stk1)-1] == 'a' {
207+
stk1 = stk1[0 : len(stk1)-1]
208+
ans += x
209+
} else {
210+
stk1 = append(stk1, s[i])
211+
}
212+
}
213+
}
214+
for _, c := range stk1 {
215+
if c != 'a' {
216+
stk2 = append(stk2, c)
217+
} else {
218+
if len(stk2) > 0 && stk2[len(stk2)-1] == 'b' {
219+
stk2 = stk2[0 : len(stk2)-1]
220+
ans += y
221+
} else {
222+
stk2 = append(stk2, c)
223+
}
224+
}
225+
}
226+
return ans
227+
}
77228
```
78229

79230
### **...**

solution/1700-1799/1717.Maximum Score From Removing Substrings/README_EN.md

+150-1
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,162 @@ Total score = 5 + 4 + 5 + 5 = 19.</pre>
5959
### **Python3**
6060

6161
```python
62-
62+
class Solution:
63+
def maximumGain(self, s: str, x: int, y: int) -> int:
64+
if x < y:
65+
return self.maximumGain(s[::-1], y, x)
66+
ans = 0
67+
stk1, stk2 = [], []
68+
for c in s:
69+
if c != 'b':
70+
stk1.append(c)
71+
else:
72+
if stk1 and stk1[-1] == 'a':
73+
stk1.pop()
74+
ans += x
75+
else:
76+
stk1.append(c)
77+
while stk1:
78+
c = stk1.pop()
79+
if c != 'b':
80+
stk2.append(c)
81+
else:
82+
if stk2 and stk2[-1] == 'a':
83+
stk2.pop()
84+
ans += y
85+
else:
86+
stk2.append(c)
87+
return ans
6388
```
6489

6590
### **Java**
6691

6792
```java
93+
class Solution {
94+
public int maximumGain(String s, int x, int y) {
95+
if (x < y) {
96+
return maximumGain(new StringBuilder(s).reverse().toString(), y, x);
97+
}
98+
int ans = 0;
99+
Deque<Character> stk1 = new ArrayDeque<>();
100+
Deque<Character> stk2 = new ArrayDeque<>();
101+
for (char c : s.toCharArray()) {
102+
if (c != 'b') {
103+
stk1.push(c);
104+
} else {
105+
if (!stk1.isEmpty() && stk1.peek() == 'a') {
106+
stk1.pop();
107+
ans += x;
108+
} else {
109+
stk1.push(c);
110+
}
111+
}
112+
}
113+
while (!stk1.isEmpty()) {
114+
char c = stk1.pop();
115+
if (c != 'b') {
116+
stk2.push(c);
117+
} else {
118+
if (!stk2.isEmpty() && stk2.peek() == 'a') {
119+
stk2.pop();
120+
ans += y;
121+
} else {
122+
stk2.push(c);
123+
}
124+
}
125+
}
126+
return ans;
127+
}
128+
}
129+
```
130+
131+
### **C++**
132+
133+
```cpp
134+
class Solution {
135+
public:
136+
int maximumGain(string s, int x, int y) {
137+
if (x < y)
138+
{
139+
reverse(s.begin(), s.end());
140+
return maximumGain(s, y, x);
141+
}
142+
int ans = 0;
143+
stack<char> stk1;
144+
stack<char> stk2;
145+
for (char c : s)
146+
{
147+
if (c != 'b') stk1.push(c);
148+
else
149+
{
150+
if (!stk1.empty() && stk1.top() == 'a')
151+
{
152+
stk1.pop();
153+
ans += x;
154+
}
155+
else stk1.push(c);
156+
}
157+
}
158+
while (!stk1.empty())
159+
{
160+
char c = stk1.top();
161+
stk1.pop();
162+
if (c != 'b') stk2.push(c);
163+
else
164+
{
165+
if (!stk2.empty() && stk2.top() == 'a')
166+
{
167+
stk2.pop();
168+
ans += y;
169+
}
170+
else stk2.push(c);
171+
}
172+
}
173+
return ans;
174+
}
175+
};
176+
```
68177
178+
### **Go**
179+
180+
```go
181+
func maximumGain(s string, x int, y int) int {
182+
if x < y {
183+
t := []rune(s)
184+
for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 {
185+
t[i], t[j] = t[j], t[i]
186+
}
187+
return maximumGain(string(t), y, x)
188+
}
189+
ans := 0
190+
var stk1 []byte
191+
var stk2 []byte
192+
for i := range s {
193+
if s[i] != 'b' {
194+
stk1 = append(stk1, s[i])
195+
} else {
196+
if len(stk1) > 0 && stk1[len(stk1)-1] == 'a' {
197+
stk1 = stk1[0 : len(stk1)-1]
198+
ans += x
199+
} else {
200+
stk1 = append(stk1, s[i])
201+
}
202+
}
203+
}
204+
for _, c := range stk1 {
205+
if c != 'a' {
206+
stk2 = append(stk2, c)
207+
} else {
208+
if len(stk2) > 0 && stk2[len(stk2)-1] == 'b' {
209+
stk2 = stk2[0 : len(stk2)-1]
210+
ans += y
211+
} else {
212+
stk2 = append(stk2, c)
213+
}
214+
}
215+
}
216+
return ans
217+
}
69218
```
70219

71220
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
class Solution {
2+
public:
3+
int maximumGain(string s, int x, int y) {
4+
if (x < y)
5+
{
6+
reverse(s.begin(), s.end());
7+
return maximumGain(s, y, x);
8+
}
9+
int ans = 0;
10+
stack<char> stk1;
11+
stack<char> stk2;
12+
for (char c : s)
13+
{
14+
if (c != 'b') stk1.push(c);
15+
else
16+
{
17+
if (!stk1.empty() && stk1.top() == 'a')
18+
{
19+
stk1.pop();
20+
ans += x;
21+
}
22+
else stk1.push(c);
23+
}
24+
}
25+
while (!stk1.empty())
26+
{
27+
char c = stk1.top();
28+
stk1.pop();
29+
if (c != 'b') stk2.push(c);
30+
else
31+
{
32+
if (!stk2.empty() && stk2.top() == 'a')
33+
{
34+
stk2.pop();
35+
ans += y;
36+
}
37+
else stk2.push(c);
38+
}
39+
}
40+
return ans;
41+
}
42+
};

0 commit comments

Comments
 (0)