给定一个仅包含'('、')'和'?'三种字符构成的字符串,'?'字符可以代替左括号或者右括号。请问该字符串可以代表多少种不同的合法括号序列
时间: 2023-05-17 19:06:50 浏览: 175
Bracket_括号_
这是一个经典的组合问题,可以使用动态规划来解决。假设字符串长度为n,定义dp[i][j]表示前i个字符中,左括号比右括号多j个的合法括号序列的数量。则有以下状态转移方程:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] + dp[i-1][j] (s[i]为'(')
dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1] + dp[i-1][j] (s[i]为')')
dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1] + dp[i-1][j] (s[i]为'?')
其中,第一行表示当前字符为左括号时的转移方程,第二行表示当前字符为右括号时的转移方程,第三行表示当前字符为问号时的转移方程。
最终答案为dp[n][0],即前n个字符中左右括号相等的合法括号序列数量。
以下是完整的代码实现:
int countValidParentheses(string s) {
int n = s.size();
vector<vector<int>> dp(n+1, vector<int>(n+1));
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
if (s[i-1] == '(') {
for (int j = 1; j <= n; j++) {
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1] + dp[i-1][j];
}
} else if (s[i-1] == ')') {
for (int j = 0; j < n; j++) {
dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1] + dp[i-1][j];
}
} else {
for (int j = 0; j <= n; j++) {
dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1] + dp[i-1][j];
}
}
}
return dp[n][0];
}
阅读全文