|
| 1 | +function countEval(s: string, result: number): number { |
| 2 | + const n = s.length; |
| 3 | + // 创建三维数组 |
| 4 | + const dp: number[][][] = new Array(n) |
| 5 | + .fill(0) |
| 6 | + .map(() => new Array(n).fill(0).map(() => new Array(2).fill(0))); |
| 7 | + // 初始化basecase s[i] 为 1,则 dp[i][i][1] = 1, dp[i][i][0] = 0 |
| 8 | + for (let i = 0; i < n; i += 2) { |
| 9 | + let tmp = 0; |
| 10 | + if (s[i] == "1") tmp = 1; |
| 11 | + dp[i][i][0] = 1 - tmp; |
| 12 | + dp[i][i][1] = tmp; |
| 13 | + } |
| 14 | + |
| 15 | + // 从0开始,每次+2 |
| 16 | + for (let step = 0; step < n; step += 2) { |
| 17 | + // 计算 i - (i+step) 的情况, j 为中间间隔点 s[j] 为符号 |
| 18 | + for (let i = 0; i + step < n; i += 2) { |
| 19 | + for (let j = i + 1; j < i + step; j += 2) { |
| 20 | + const left0 = dp[i][j - 1][0], |
| 21 | + left1 = dp[i][j - 1][1]; |
| 22 | + const right0 = dp[j + 1][i + step][0], |
| 23 | + right1 = dp[j + 1][i + step][1]; |
| 24 | + if (s[j] == "&") { |
| 25 | + dp[i][i + step][0] += left0 * (right0 + right1) + |
| 26 | + left1 * right0; |
| 27 | + dp[i][i + step][1] += left1 * right1; |
| 28 | + } else if (s[j] == "|") { |
| 29 | + dp[i][i + step][0] += left0 * right0; |
| 30 | + dp[i][i + step][1] += left0 * right1 + |
| 31 | + left1 * (right0 + right1); |
| 32 | + } else { |
| 33 | + //s[j]=='^' |
| 34 | + dp[i][i + step][0] += left0 * right0 + left1 * right1; |
| 35 | + dp[i][i + step][1] += left0 * right1 + left1 * right0; |
| 36 | + } |
| 37 | + } |
| 38 | + } |
| 39 | + } |
| 40 | + return dp[0][n - 1][result]; |
| 41 | +} |
| 42 | +export default countEval; |
0 commit comments