678.有效的括号字符串
·127 words·1 min·
0
·
0
·
![Ryan](/img/logo.png)
Author
Ryan
对于一个字符串, 如果它是有效的, 那么就是2种情况:
- 最左和最右的字符能凑能一对括号
- 将字符串从中间某个位置分成2个子串, 且两个子串分别是有效的括号字符串
class Solution:
def checkValidString(self, s: str) -> bool:
N = len(s)
# dp[i][j] 表示 i 到j能否组成合法的字符串
dp = [[False for _ in range(N)] for _ in range(N)]
# 仅有一个字符成立的情况
for i in range(N):
if s[i] == "*":
dp[i][i] = True
# 2个连续字符成立的情况
for i in range(N-1):
if (s[i] == "(" or s[i] == "*" )and (s[i+1] == ")" or s[i+1] == "*" ):
dp[i][i+1] = True
for j in range(N):
for i in range(j-2, -1, -1):
# 如果两端能组成, 那么就看中间
if (s[i] == "(" or s[i] == "*" )and (s[j] == ")" or s[j] == "*" ):
dp[i][j] = dp[i+1][j-1]
# 尝试把整个子数组分成两份
k = i
while k < j and not dp[i][j]:
dp[i][j] = dp[i][k] and dp[k+1][j]
k += 1
return dp[0][N-1]