Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4832e79

Browse files
committed
feat: add solutions to lc problem: No.0301
No.0301.Remove Invalid Parentheses
1 parent 2767e38 commit 4832e79

File tree

5 files changed

+375
-68
lines changed

5 files changed

+375
-68
lines changed

‎solution/0300-0399/0301.Remove Invalid Parentheses/README.md‎

Lines changed: 134 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,27 +65,159 @@
6565
<li><code>s</code> 中至多含 <code>20</code> 个括号</li>
6666
</ul>
6767

68-
6968
## 解法
7069

7170
<!-- 这里可写通用的实现逻辑 -->
7271

72+
DFS + 剪枝。
73+
74+
`ldel`, `rdel` 分别表示最少需要删除的 `(`, `)` 的个数。
75+
7376
<!-- tabs:start -->
7477

7578
### **Python3**
7679

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

7982
```python
80-
83+
class Solution:
84+
def removeInvalidParentheses(self, s: str) -> List[str]:
85+
def dfs(i, t, lcnt, rcnt, ldel, rdel):
86+
nonlocal tdel, ans
87+
if ldel * rdel < 0 or lcnt < rcnt or ldel + rdel > len(s) - i:
88+
return
89+
if ldel == 0 and rdel == 0:
90+
if len(s) - len(t) == tdel:
91+
ans.add(t)
92+
if i == len(s):
93+
return
94+
if s[i] == '(':
95+
dfs(i + 1, t, lcnt, rcnt, ldel - 1, rdel)
96+
dfs(i + 1, t + '(', lcnt + 1, rcnt, ldel, rdel)
97+
elif s[i] == ')':
98+
dfs(i + 1, t, lcnt, rcnt, ldel, rdel - 1)
99+
dfs(i + 1, t + ')', lcnt, rcnt + 1, ldel, rdel)
100+
else:
101+
dfs(i + 1, t + s[i], lcnt, rcnt, ldel, rdel)
102+
103+
ldel = rdel = 0
104+
for c in s:
105+
if c == '(':
106+
ldel += 1
107+
elif c == ')':
108+
if ldel == 0:
109+
rdel += 1
110+
else:
111+
ldel -= 1
112+
tdel = ldel + rdel
113+
ans = set()
114+
dfs(0, '', 0, 0, ldel, rdel)
115+
return list(ans)
81116
```
82117

83118
### **Java**
84119

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

87122
```java
123+
class Solution {
124+
private int tdel;
125+
private String s;
126+
private Set<String> ans;
127+
128+
public List<String> removeInvalidParentheses(String s) {
129+
int ldel = 0, rdel = 0;
130+
for (char c : s.toCharArray()) {
131+
if (c == '(') {
132+
++ldel;
133+
} else if (c == ')') {
134+
if (ldel == 0) {
135+
++rdel;
136+
} else {
137+
--ldel;
138+
}
139+
}
140+
}
141+
tdel = ldel + rdel;
142+
this.s = s;
143+
ans = new HashSet<>();
144+
dfs(0, "", 0, 0, ldel, rdel);
145+
return new ArrayList<>(ans);
146+
}
147+
148+
private void dfs(int i, String t, int lcnt, int rcnt, int ldel, int rdel) {
149+
if (ldel * rdel < 0 || lcnt < rcnt || ldel + rdel > s.length() - i) {
150+
return;
151+
}
152+
if (ldel == 0 && rdel == 0) {
153+
if (s.length() - t.length() == tdel) {
154+
ans.add(t);
155+
}
156+
}
157+
if (i == s.length()) {
158+
return;
159+
}
160+
char c = s.charAt(i);
161+
if (c == '(') {
162+
dfs(i + 1, t, lcnt, rcnt, ldel - 1, rdel);
163+
dfs(i + 1, t + String.valueOf(c), lcnt + 1, rcnt, ldel, rdel);
164+
} else if (c == ')') {
165+
dfs(i + 1, t, lcnt, rcnt, ldel, rdel - 1);
166+
dfs(i + 1, t + String.valueOf(c), lcnt, rcnt + 1, ldel, rdel);
167+
} else {
168+
dfs(i + 1, t + String.valueOf(c), lcnt, rcnt, ldel, rdel);
169+
}
170+
}
171+
}
172+
```
88173

174+
### **C++**
175+
176+
```cpp
177+
class Solution {
178+
public:
179+
vector<string> removeInvalidParentheses(string s) {
180+
int ldel = 0, rdel = 0;
181+
for (char c : s)
182+
{
183+
if (c == '(') ++ldel;
184+
else if (c == ')')
185+
{
186+
if (ldel == 0) ++rdel;
187+
else --ldel;
188+
}
189+
}
190+
int tdel = ldel + rdel;
191+
unordered_set<string> ans;
192+
dfs(0, "", s, 0, 0, ldel, rdel, tdel, ans);
193+
vector<string> res;
194+
res.assign(ans.begin(), ans.end());
195+
return res;
196+
}
197+
198+
void dfs(int i, string t, string s, int lcnt, int rcnt, int ldel, int rdel, int tdel, unordered_set<string>& ans) {
199+
if (ldel * rdel < 0 || lcnt < rcnt || ldel + rdel > s.size() - i) return;
200+
if (ldel == 0 && rdel == 0)
201+
{
202+
if (s.size() - t.size() == tdel) ans.insert(t);
203+
}
204+
if (i == s.size()) return;
205+
if (s[i] == '(')
206+
{
207+
dfs(i + 1, t, s, lcnt, rcnt, ldel - 1, rdel, tdel, ans);
208+
dfs(i + 1, t + s[i], s, lcnt + 1, rcnt, ldel, rdel, tdel, ans);
209+
}
210+
else if (s[i] == ')')
211+
{
212+
dfs(i + 1, t, s, lcnt, rcnt, ldel, rdel - 1, tdel, ans);
213+
dfs(i + 1, t + s[i], s, lcnt, rcnt + 1, ldel, rdel, tdel, ans);
214+
}
215+
else
216+
{
217+
dfs(i + 1, t + s[i], s, lcnt, rcnt, ldel, rdel, tdel, ans);
218+
}
219+
}
220+
};
89221
```
90222

91223
### **...**

‎solution/0300-0399/0301.Remove Invalid Parentheses/README_EN.md‎

Lines changed: 130 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,149 @@
3939
<li>There will be at most <code>20</code> parentheses in <code>s</code>.</li>
4040
</ul>
4141

42-
4342
## Solutions
4443

4544
<!-- tabs:start -->
4645

4746
### **Python3**
4847

4948
```python
50-
49+
class Solution:
50+
def removeInvalidParentheses(self, s: str) -> List[str]:
51+
def dfs(i, t, lcnt, rcnt, ldel, rdel):
52+
nonlocal tdel, ans
53+
if ldel * rdel < 0 or lcnt < rcnt or ldel + rdel > len(s) - i:
54+
return
55+
if ldel == 0 and rdel == 0:
56+
if len(s) - len(t) == tdel:
57+
ans.add(t)
58+
if i == len(s):
59+
return
60+
if s[i] == '(':
61+
dfs(i + 1, t, lcnt, rcnt, ldel - 1, rdel)
62+
dfs(i + 1, t + '(', lcnt + 1, rcnt, ldel, rdel)
63+
elif s[i] == ')':
64+
dfs(i + 1, t, lcnt, rcnt, ldel, rdel - 1)
65+
dfs(i + 1, t + ')', lcnt, rcnt + 1, ldel, rdel)
66+
else:
67+
dfs(i + 1, t + s[i], lcnt, rcnt, ldel, rdel)
68+
69+
ldel = rdel = 0
70+
for c in s:
71+
if c == '(':
72+
ldel += 1
73+
elif c == ')':
74+
if ldel == 0:
75+
rdel += 1
76+
else:
77+
ldel -= 1
78+
tdel = ldel + rdel
79+
ans = set()
80+
dfs(0, '', 0, 0, ldel, rdel)
81+
return list(ans)
5182
```
5283

5384
### **Java**
5485

5586
```java
87+
class Solution {
88+
private int tdel;
89+
private String s;
90+
private Set<String> ans;
91+
92+
public List<String> removeInvalidParentheses(String s) {
93+
int ldel = 0, rdel = 0;
94+
for (char c : s.toCharArray()) {
95+
if (c == '(') {
96+
++ldel;
97+
} else if (c == ')') {
98+
if (ldel == 0) {
99+
++rdel;
100+
} else {
101+
--ldel;
102+
}
103+
}
104+
}
105+
tdel = ldel + rdel;
106+
this.s = s;
107+
ans = new HashSet<>();
108+
dfs(0, "", 0, 0, ldel, rdel);
109+
return new ArrayList<>(ans);
110+
}
111+
112+
private void dfs(int i, String t, int lcnt, int rcnt, int ldel, int rdel) {
113+
if (ldel * rdel < 0 || lcnt < rcnt || ldel + rdel > s.length() - i) {
114+
return;
115+
}
116+
if (ldel == 0 && rdel == 0) {
117+
if (s.length() - t.length() == tdel) {
118+
ans.add(t);
119+
}
120+
}
121+
if (i == s.length()) {
122+
return;
123+
}
124+
char c = s.charAt(i);
125+
if (c == '(') {
126+
dfs(i + 1, t, lcnt, rcnt, ldel - 1, rdel);
127+
dfs(i + 1, t + String.valueOf(c), lcnt + 1, rcnt, ldel, rdel);
128+
} else if (c == ')') {
129+
dfs(i + 1, t, lcnt, rcnt, ldel, rdel - 1);
130+
dfs(i + 1, t + String.valueOf(c), lcnt, rcnt + 1, ldel, rdel);
131+
} else {
132+
dfs(i + 1, t + String.valueOf(c), lcnt, rcnt, ldel, rdel);
133+
}
134+
}
135+
}
136+
```
56137

138+
### **C++**
139+
140+
```cpp
141+
class Solution {
142+
public:
143+
vector<string> removeInvalidParentheses(string s) {
144+
int ldel = 0, rdel = 0;
145+
for (char c : s)
146+
{
147+
if (c == '(') ++ldel;
148+
else if (c == ')')
149+
{
150+
if (ldel == 0) ++rdel;
151+
else --ldel;
152+
}
153+
}
154+
int tdel = ldel + rdel;
155+
unordered_set<string> ans;
156+
dfs(0, "", s, 0, 0, ldel, rdel, tdel, ans);
157+
vector<string> res;
158+
res.assign(ans.begin(), ans.end());
159+
return res;
160+
}
161+
162+
void dfs(int i, string t, string s, int lcnt, int rcnt, int ldel, int rdel, int tdel, unordered_set<string>& ans) {
163+
if (ldel * rdel < 0 || lcnt < rcnt || ldel + rdel > s.size() - i) return;
164+
if (ldel == 0 && rdel == 0)
165+
{
166+
if (s.size() - t.size() == tdel) ans.insert(t);
167+
}
168+
if (i == s.size()) return;
169+
if (s[i] == '(')
170+
{
171+
dfs(i + 1, t, s, lcnt, rcnt, ldel - 1, rdel, tdel, ans);
172+
dfs(i + 1, t + s[i], s, lcnt + 1, rcnt, ldel, rdel, tdel, ans);
173+
}
174+
else if (s[i] == ')')
175+
{
176+
dfs(i + 1, t, s, lcnt, rcnt, ldel, rdel - 1, tdel, ans);
177+
dfs(i + 1, t + s[i], s, lcnt, rcnt + 1, ldel, rdel, tdel, ans);
178+
}
179+
else
180+
{
181+
dfs(i + 1, t + s[i], s, lcnt, rcnt, ldel, rdel, tdel, ans);
182+
}
183+
}
184+
};
57185
```
58186

59187
### **...**
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class Solution {
2+
public:
3+
vector<string> removeInvalidParentheses(string s) {
4+
int ldel = 0, rdel = 0;
5+
for (char c : s)
6+
{
7+
if (c == '(') ++ldel;
8+
else if (c == ')')
9+
{
10+
if (ldel == 0) ++rdel;
11+
else --ldel;
12+
}
13+
}
14+
int tdel = ldel + rdel;
15+
unordered_set<string> ans;
16+
dfs(0, "", s, 0, 0, ldel, rdel, tdel, ans);
17+
vector<string> res;
18+
res.assign(ans.begin(), ans.end());
19+
return res;
20+
}
21+
22+
void dfs(int i, string t, string s, int lcnt, int rcnt, int ldel, int rdel, int tdel, unordered_set<string>& ans) {
23+
if (ldel * rdel < 0 || lcnt < rcnt || ldel + rdel > s.size() - i) return;
24+
if (ldel == 0 && rdel == 0)
25+
{
26+
if (s.size() - t.size() == tdel) ans.insert(t);
27+
}
28+
if (i == s.size()) return;
29+
if (s[i] == '(')
30+
{
31+
dfs(i + 1, t, s, lcnt, rcnt, ldel - 1, rdel, tdel, ans);
32+
dfs(i + 1, t + s[i], s, lcnt + 1, rcnt, ldel, rdel, tdel, ans);
33+
}
34+
else if (s[i] == ')')
35+
{
36+
dfs(i + 1, t, s, lcnt, rcnt, ldel, rdel - 1, tdel, ans);
37+
dfs(i + 1, t + s[i], s, lcnt, rcnt + 1, ldel, rdel, tdel, ans);
38+
}
39+
else
40+
{
41+
dfs(i + 1, t + s[i], s, lcnt, rcnt, ldel, rdel, tdel, ans);
42+
}
43+
}
44+
};

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /