|
66 | 66 |
|
67 | 67 | 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为字符串 `s` 的长度。
|
68 | 68 |
|
| 69 | +相似题目:[2116. 判断一个括号字符串是否有效](/solution/2100-2199/2116.Check%20if%20a%20Parentheses%20String%20Can%20Be%20Valid/README.md) |
| 70 | + |
69 | 71 | <!-- tabs:start -->
|
70 | 72 |
|
71 | 73 | ### **Python3**
|
@@ -93,33 +95,22 @@ class Solution:
|
93 | 95 | ```python
|
94 | 96 | class Solution:
|
95 | 97 | def checkValidString(self, s: str) -> bool:
|
96 |
| - n = len(s) |
97 |
| - left = asterisk = 0 |
98 |
| - for i in range(n): |
99 |
| - if s[i] == "(": |
100 |
| - left += 1 |
101 |
| - elif s[i] == ")": |
102 |
| - if left > 0: |
103 |
| - left -= 1 |
104 |
| - elif asterisk > 0: |
105 |
| - asterisk -= 1 |
106 |
| - else: |
107 |
| - return False |
| 98 | + x = 0 |
| 99 | + for c in s: |
| 100 | + if c in '(*': |
| 101 | + x += 1 |
| 102 | + elif x: |
| 103 | + x -= 1 |
108 | 104 | else:
|
109 |
| - asterisk += 1 |
110 |
| - right = asterisk = 0 |
111 |
| - for i in range(n - 1, -1, -1): |
112 |
| - if s[i] == ")": |
113 |
| - right += 1 |
114 |
| - elif s[i] == "(": |
115 |
| - if right > 0: |
116 |
| - right -= 1 |
117 |
| - elif asterisk > 0: |
118 |
| - asterisk -= 1 |
119 |
| - else: |
120 |
| - return False |
| 105 | + return False |
| 106 | + x = 0 |
| 107 | + for c in s[::-1]: |
| 108 | + if c in '*)': |
| 109 | + x += 1 |
| 110 | + elif x: |
| 111 | + x -= 1 |
121 | 112 | else:
|
122 |
| - asterisk += 1 |
| 113 | + return False |
123 | 114 | return True
|
124 | 115 | ```
|
125 | 116 |
|
@@ -152,39 +143,25 @@ class Solution {
|
152 | 143 | ```java
|
153 | 144 | class Solution {
|
154 | 145 | public boolean checkValidString(String s) {
|
| 146 | + int x = 0; |
155 | 147 | int n = s.length();
|
156 |
| - char[] a = s.toCharArray(); |
157 |
| - int left = 0, asterisk = 0; |
158 |
| - for (int i = 0; i < n; i++) { |
159 |
| - if (a[i] == '(') { |
160 |
| - left++; |
161 |
| - } else if (a[i] == ')') { |
162 |
| - if (left > 0) { |
163 |
| - left--; |
164 |
| - } else if (asterisk > 0) { |
165 |
| - asterisk--; |
166 |
| - } else { |
167 |
| - return false; |
168 |
| - } |
| 148 | + for (int i = 0; i < n; ++i) { |
| 149 | + if (s.charAt(i) != ')') { |
| 150 | + ++x; |
| 151 | + } else if (x > 0) { |
| 152 | + --x; |
169 | 153 | } else {
|
170 |
| - asterisk++; |
| 154 | + return false; |
171 | 155 | }
|
172 | 156 | }
|
173 |
| - int right = 0; |
174 |
| - asterisk = 0; |
175 |
| - for (int i = n - 1; i >= 0; i--) { |
176 |
| - if (a[i] == ')') { |
177 |
| - right++; |
178 |
| - } else if (a[i] == '(') { |
179 |
| - if (right > 0) { |
180 |
| - right--; |
181 |
| - } else if (asterisk > 0) { |
182 |
| - asterisk--; |
183 |
| - } else { |
184 |
| - return false; |
185 |
| - } |
| 157 | + x = 0; |
| 158 | + for (int i = n - 1; i >= 0; --i) { |
| 159 | + if (s.charAt(i) != '(') { |
| 160 | + ++x; |
| 161 | + } else if (x > 0) { |
| 162 | + --x; |
186 | 163 | } else {
|
187 |
| - asterisk++; |
| 164 | + return false; |
188 | 165 | }
|
189 | 166 | }
|
190 | 167 | return true;
|
@@ -221,36 +198,24 @@ public:
|
221 | 198 | class Solution {
|
222 | 199 | public:
|
223 | 200 | bool checkValidString(string s) {
|
224 |
| - int n = s.size(); |
225 |
| - int left = 0, asterisk = 0; |
| 201 | + int x = 0, n = s.size(); |
226 | 202 | for (int i = 0; i < n; ++i) {
|
227 |
| - if (s[i] == '(') { |
228 |
| - ++left; |
229 |
| - } else if (s[i] == ')') { |
230 |
| - if (left > 0) |
231 |
| - --left; |
232 |
| - else if (asterisk > 0) |
233 |
| - --asterisk; |
234 |
| - else |
235 |
| - return false; |
| 203 | + if (s[i] != ')') { |
| 204 | + ++x; |
| 205 | + } else if (x) { |
| 206 | + --x; |
236 | 207 | } else {
|
237 |
| - ++asterisk; |
| 208 | + return false; |
238 | 209 | }
|
239 | 210 | }
|
240 |
| - int right = 0; |
241 |
| - asterisk = 0; |
| 211 | + x = 0; |
242 | 212 | for (int i = n - 1; i >= 0; --i) {
|
243 |
| - if (s[i] == ')') { |
244 |
| - ++right; |
245 |
| - } else if (s[i] == '(') { |
246 |
| - if (right > 0) |
247 |
| - --right; |
248 |
| - else if (asterisk > 0) |
249 |
| - --asterisk; |
250 |
| - else |
251 |
| - return false; |
| 213 | + if (s[i] != '(') { |
| 214 | + ++x; |
| 215 | + } else if (x) { |
| 216 | + --x; |
252 | 217 | } else {
|
253 |
| - ++asterisk; |
| 218 | + return false; |
254 | 219 | }
|
255 | 220 | }
|
256 | 221 | return true;
|
@@ -283,38 +248,24 @@ func checkValidString(s string) bool {
|
283 | 248 |
|
284 | 249 | ```go
|
285 | 250 | func checkValidString(s string) bool {
|
286 |
| - n := len(s) |
287 |
| - left, asterisk := 0, 0 |
288 |
| - for i := 0; i < n; i++ { |
289 |
| - if s[i] == '(' { |
290 |
| - left++ |
291 |
| - } else if s[i] == ')' { |
292 |
| - if left > 0 { |
293 |
| - left-- |
294 |
| - } else if asterisk > 0 { |
295 |
| - asterisk-- |
296 |
| - } else { |
297 |
| - return false |
298 |
| - } |
| 251 | + x := 0 |
| 252 | + for _, c := range s { |
| 253 | + if c != ')' { |
| 254 | + x++ |
| 255 | + } else if x > 0 { |
| 256 | + x-- |
299 | 257 | } else {
|
300 |
| - asterisk++ |
| 258 | + return false |
301 | 259 | }
|
302 | 260 | }
|
303 |
| - asterisk = 0 |
304 |
| - right := 0 |
305 |
| - for i := n - 1; i >= 0; i-- { |
306 |
| - if s[i] == ')' { |
307 |
| - right++ |
308 |
| - } else if s[i] == '(' { |
309 |
| - if right > 0 { |
310 |
| - right-- |
311 |
| - } else if asterisk > 0 { |
312 |
| - asterisk-- |
313 |
| - } else { |
314 |
| - return false |
315 |
| - } |
| 261 | + x = 0 |
| 262 | + for i := len(s) - 1; i >= 0; i-- { |
| 263 | + if s[i] != '(' { |
| 264 | + x++ |
| 265 | + } else if x > 0 { |
| 266 | + x-- |
316 | 267 | } else {
|
317 |
| - asterisk++ |
| 268 | + return false |
318 | 269 | }
|
319 | 270 | }
|
320 | 271 | return true
|
|
0 commit comments