Skip to content

Commit 5026178

Browse files
committed
feat: add solutions to lc problem: No.0678.Valid Parenthesis String
1 parent 3f04a5b commit 5026178

File tree

6 files changed

+457
-2
lines changed

6 files changed

+457
-2
lines changed

solution/0600-0699/0678.Valid Parenthesis String/README.md

+156-1
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,177 @@
4848

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

51+
两遍扫描,第一遍从左往右,确定每一个右括号都可以成功配对,第二遍从右往左,确定每一个左括号都可以成功配对
52+
5153
<!-- tabs:start -->
5254

5355
### **Python3**
5456

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

5759
```python
58-
60+
class Solution:
61+
def checkValidString(self, s: str) -> bool:
62+
n = len(s)
63+
left, asterisk = 0, 0
64+
for i in range(n):
65+
if s[i] == "(":
66+
left += 1
67+
elif s[i] == ")":
68+
if left > 0:
69+
left -= 1
70+
elif asterisk > 0:
71+
asterisk -= 1
72+
else:
73+
return False
74+
else:
75+
asterisk += 1
76+
right, asterisk = 0, 0
77+
for i in range(n - 1, -1, -1):
78+
if s[i] == ")":
79+
right += 1
80+
elif s[i] == "(":
81+
if right > 0:
82+
right -= 1
83+
elif asterisk > 0:
84+
asterisk -= 1
85+
else:
86+
return False
87+
else:
88+
asterisk += 1
89+
return True
5990
```
6091

6192
### **Java**
6293

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

6596
```java
97+
class Solution {
98+
public boolean checkValidString(String s) {
99+
int n = s.length();
100+
char[] a = s.toCharArray();
101+
int left = 0, asterisk = 0;
102+
for (int i = 0; i < n; i++) {
103+
if (a[i] == '(') {
104+
left++;
105+
} else if (a[i] == ')') {
106+
if (left > 0) {
107+
left--;
108+
} else if (asterisk > 0) {
109+
asterisk--;
110+
} else {
111+
return false;
112+
}
113+
} else {
114+
asterisk++;
115+
}
116+
}
117+
int right = 0;
118+
asterisk = 0;
119+
for (int i = n - 1; i >= 0; i--) {
120+
if (a[i] == ')') {
121+
right++;
122+
} else if (a[i] == '(') {
123+
if (right > 0) {
124+
right--;
125+
} else if (asterisk > 0) {
126+
asterisk--;
127+
} else {
128+
return false;
129+
}
130+
} else {
131+
asterisk++;
132+
}
133+
}
134+
return true;
135+
}
136+
}
137+
```
138+
139+
### **C++**
140+
141+
```cpp
142+
class Solution {
143+
public:
144+
bool checkValidString(string s) {
145+
int n = s.size();
146+
int left = 0, asterisk = 0;
147+
for (int i = 0; i < n; ++i) {
148+
if (s[i] == '(') {
149+
++left;
150+
} else if (s[i] == ')') {
151+
if (left > 0)
152+
--left;
153+
else if (asterisk > 0)
154+
--asterisk;
155+
else
156+
return false;
157+
} else {
158+
++asterisk;
159+
}
160+
}
161+
int right = 0;
162+
asterisk = 0;
163+
for (int i = n - 1; i >= 0; --i) {
164+
if (s[i] == ')') {
165+
++right;
166+
} else if (s[i] == '(') {
167+
if (right > 0)
168+
--right;
169+
else if (asterisk > 0)
170+
--asterisk;
171+
else
172+
return false;
173+
} else {
174+
++asterisk;
175+
}
176+
}
177+
return true;
178+
}
179+
};
180+
```
66181
182+
### **Go**
183+
184+
```go
185+
func checkValidString(s string) bool {
186+
n := len(s)
187+
left, asterisk := 0, 0
188+
for i := 0; i < n; i++ {
189+
if s[i] == '(' {
190+
left++
191+
} else if s[i] == ')' {
192+
if left > 0 {
193+
left--
194+
} else if asterisk > 0 {
195+
asterisk--
196+
} else {
197+
return false
198+
}
199+
} else {
200+
asterisk++
201+
}
202+
}
203+
asterisk = 0
204+
right := 0
205+
for i := n - 1; i >= 0; i-- {
206+
if s[i] == ')' {
207+
right++
208+
} else if s[i] == '(' {
209+
if right > 0 {
210+
right--
211+
} else if asterisk > 0 {
212+
asterisk--
213+
} else {
214+
return false
215+
}
216+
} else {
217+
asterisk++
218+
}
219+
}
220+
return true
221+
}
67222
```
68223

69224
### **...**

solution/0600-0699/0678.Valid Parenthesis String/README_EN.md

+156-1
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,173 @@
3737

3838
## Solutions
3939

40+
Scan twice, first from left to right to make sure that each of the closing brackets is matched successfully, and second from right to left to make sure that each of the opening brackets is matched successfully
41+
4042
<!-- tabs:start -->
4143

4244
### **Python3**
4345

4446
```python
45-
47+
class Solution:
48+
def checkValidString(self, s: str) -> bool:
49+
n = len(s)
50+
left, asterisk = 0, 0
51+
for i in range(n):
52+
if s[i] == "(":
53+
left += 1
54+
elif s[i] == ")":
55+
if left > 0:
56+
left -= 1
57+
elif asterisk > 0:
58+
asterisk -= 1
59+
else:
60+
return False
61+
else:
62+
asterisk += 1
63+
right, asterisk = 0, 0
64+
for i in range(n - 1, -1, -1):
65+
if s[i] == ")":
66+
right += 1
67+
elif s[i] == "(":
68+
if right > 0:
69+
right -= 1
70+
elif asterisk > 0:
71+
asterisk -= 1
72+
else:
73+
return False
74+
else:
75+
asterisk += 1
76+
return True
4677
```
4778

4879
### **Java**
4980

5081
```java
82+
class Solution {
83+
public boolean checkValidString(String s) {
84+
int n = s.length();
85+
char[] a = s.toCharArray();
86+
int left = 0, asterisk = 0;
87+
for (int i = 0; i < n; i++) {
88+
if (a[i] == '(') {
89+
left++;
90+
} else if (a[i] == ')') {
91+
if (left > 0) {
92+
left--;
93+
} else if (asterisk > 0) {
94+
asterisk--;
95+
} else {
96+
return false;
97+
}
98+
} else {
99+
asterisk++;
100+
}
101+
}
102+
int right = 0;
103+
asterisk = 0;
104+
for (int i = n - 1; i >= 0; i--) {
105+
if (a[i] == ')') {
106+
right++;
107+
} else if (a[i] == '(') {
108+
if (right > 0) {
109+
right--;
110+
} else if (asterisk > 0) {
111+
asterisk--;
112+
} else {
113+
return false;
114+
}
115+
} else {
116+
asterisk++;
117+
}
118+
}
119+
return true;
120+
}
121+
}
122+
```
123+
124+
### **C++**
125+
126+
```cpp
127+
class Solution {
128+
public:
129+
bool checkValidString(string s) {
130+
int n = s.size();
131+
int left = 0, asterisk = 0;
132+
for (int i = 0; i < n; ++i) {
133+
if (s[i] == '(') {
134+
++left;
135+
} else if (s[i] == ')') {
136+
if (left > 0)
137+
--left;
138+
else if (asterisk > 0)
139+
--asterisk;
140+
else
141+
return false;
142+
} else {
143+
++asterisk;
144+
}
145+
}
146+
int right = 0;
147+
asterisk = 0;
148+
for (int i = n - 1; i >= 0; --i) {
149+
if (s[i] == ')') {
150+
++right;
151+
} else if (s[i] == '(') {
152+
if (right > 0)
153+
--right;
154+
else if (asterisk > 0)
155+
--asterisk;
156+
else
157+
return false;
158+
} else {
159+
++asterisk;
160+
}
161+
}
162+
return true;
163+
}
164+
};
165+
```
51166
167+
### **Go**
168+
169+
```go
170+
func checkValidString(s string) bool {
171+
n := len(s)
172+
left, asterisk := 0, 0
173+
for i := 0; i < n; i++ {
174+
if s[i] == '(' {
175+
left++
176+
} else if s[i] == ')' {
177+
if left > 0 {
178+
left--
179+
} else if asterisk > 0 {
180+
asterisk--
181+
} else {
182+
return false
183+
}
184+
} else {
185+
asterisk++
186+
}
187+
}
188+
asterisk = 0
189+
right := 0
190+
for i := n - 1; i >= 0; i-- {
191+
if s[i] == ')' {
192+
right++
193+
} else if s[i] == '(' {
194+
if right > 0 {
195+
right--
196+
} else if asterisk > 0 {
197+
asterisk--
198+
} else {
199+
return false
200+
}
201+
} else {
202+
asterisk++
203+
}
204+
}
205+
return true
206+
}
52207
```
53208

54209
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
public:
3+
bool checkValidString(string s) {
4+
int n = s.size();
5+
int left = 0, asterisk = 0;
6+
for (int i = 0; i < n; ++i) {
7+
if (s[i] == '(') {
8+
++left;
9+
} else if (s[i] == ')') {
10+
if (left > 0)
11+
--left;
12+
else if (asterisk > 0)
13+
--asterisk;
14+
else
15+
return false;
16+
} else {
17+
++asterisk;
18+
}
19+
}
20+
int right = 0;
21+
asterisk = 0;
22+
for (int i = n - 1; i >= 0; --i) {
23+
if (s[i] == ')') {
24+
++right;
25+
} else if (s[i] == '(') {
26+
if (right > 0)
27+
--right;
28+
else if (asterisk > 0)
29+
--asterisk;
30+
else
31+
return false;
32+
} else {
33+
++asterisk;
34+
}
35+
}
36+
return true;
37+
}
38+
};

0 commit comments

Comments
 (0)