|
58 | 58 |
|
59 | 59 | <!-- 这里可写通用的实现逻辑 -->
|
60 | 60 |
|
| 61 | +**方法一:栈** |
| 62 | + |
| 63 | +对于这种表达式解析问题,我们可以使用栈来辅助解决。 |
| 64 | + |
| 65 | +从左到右遍历表达式 `expression`,对于遍历到的每个字符 $c$: |
| 66 | + |
| 67 | +- 如果 $c$ 是 `"tf!&|"` 中的一个,我们直接将其入栈; |
| 68 | +- 如果 $c$ 是右括号 `')'`,我们将栈中元素依次出栈,直到遇到操作符 `'!'` 或 `'&'` 或 `'|'`。过程中我们用变量 $t$ 和 $f$ 记录出栈字符中 `'t'` 和 `'f'` 的个数。最后根据出栈字符的个数和操作符计算得到新的字符 `'t'` 或 `'f'`,并将其入栈。 |
| 69 | + |
| 70 | +遍历完表达式 `expression` 后,栈中只剩下一个字符,如果是 `'t'`,返回 `true`,否则返回 `false`。 |
| 71 | + |
| 72 | +时间复杂度 $O(n)$,空间复杂度 $O(n)$。 |
| 73 | + |
61 | 74 | <!-- tabs:start -->
|
62 | 75 |
|
63 | 76 | ### **Python3**
|
64 | 77 |
|
65 | 78 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
66 | 79 |
|
67 | 80 | ```python
|
68 |
| - |
| 81 | +class Solution: |
| 82 | + def parseBoolExpr(self, expression: str) -> bool: |
| 83 | + stk = [] |
| 84 | + for c in expression: |
| 85 | + if c in 'tf!&|': |
| 86 | + stk.append(c) |
| 87 | + elif c == ')': |
| 88 | + t = f = 0 |
| 89 | + while stk[-1] in 'tf': |
| 90 | + t += stk[-1] == 't' |
| 91 | + f += stk[-1] == 'f' |
| 92 | + stk.pop() |
| 93 | + match stk.pop(): |
| 94 | + case '!': |
| 95 | + c = 't' if f else 'f' |
| 96 | + case '&': |
| 97 | + c = 'f' if f else 't' |
| 98 | + case '|': |
| 99 | + c = 't' if t else 'f' |
| 100 | + stk.append(c) |
| 101 | + return stk[0] == 't' |
69 | 102 | ```
|
70 | 103 |
|
71 | 104 | ### **Java**
|
72 | 105 |
|
73 | 106 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
74 | 107 |
|
75 | 108 | ```java
|
| 109 | +class Solution { |
| 110 | + public boolean parseBoolExpr(String expression) { |
| 111 | + Deque<Character> stk = new ArrayDeque<>(); |
| 112 | + for (int i = 0; i < expression.length(); ++i) { |
| 113 | + char c = expression.charAt(i); |
| 114 | + if (c != '(' && c != ')' && c != ',') { |
| 115 | + stk.push(c); |
| 116 | + } else if (c == ')') { |
| 117 | + int t = 0, f = 0; |
| 118 | + while (stk.peek() == 't' || stk.peek() == 'f') { |
| 119 | + t += stk.peek() == 't' ? 1 : 0; |
| 120 | + f += stk.peek() == 'f' ? 1 : 0; |
| 121 | + stk.pop(); |
| 122 | + } |
| 123 | + char op = stk.pop(); |
| 124 | + if (op == '!') { |
| 125 | + c = f > 0 ? 't' : 'f'; |
| 126 | + } else if (op == '&') { |
| 127 | + c = f > 0 ? 'f' : 't'; |
| 128 | + } else { |
| 129 | + c = t > 0 ? 't' : 'f'; |
| 130 | + } |
| 131 | + stk.push(c); |
| 132 | + } |
| 133 | + } |
| 134 | + return stk.peek() == 't'; |
| 135 | + } |
| 136 | +} |
| 137 | +``` |
| 138 | + |
| 139 | +### **C++** |
| 140 | + |
| 141 | +```cpp |
| 142 | +class Solution { |
| 143 | +public: |
| 144 | + bool parseBoolExpr(string expression) { |
| 145 | + stack<char> stk; |
| 146 | + for (char c : expression) { |
| 147 | + if (c != '(' && c != ')' && c != ',') stk.push(c); |
| 148 | + else if (c == ')') { |
| 149 | + int t = 0, f = 0; |
| 150 | + while (stk.top() == 't' || stk.top() == 'f') { |
| 151 | + t += stk.top() == 't'; |
| 152 | + f += stk.top() == 'f'; |
| 153 | + stk.pop(); |
| 154 | + } |
| 155 | + char op = stk.top(); |
| 156 | + stk.pop(); |
| 157 | + if (op == '!') c = f ? 't' : 'f'; |
| 158 | + if (op == '&') c = f ? 'f' : 't'; |
| 159 | + if (op == '|') c = t ? 't' : 'f'; |
| 160 | + stk.push(c); |
| 161 | + } |
| 162 | + } |
| 163 | + return stk.top() == 't'; |
| 164 | + } |
| 165 | +}; |
| 166 | +``` |
76 | 167 |
|
| 168 | +### **Go** |
| 169 | +
|
| 170 | +```go |
| 171 | +func parseBoolExpr(expression string) bool { |
| 172 | + stk := []rune{} |
| 173 | + for _, c := range expression { |
| 174 | + if c != '(' && c != ')' && c != ',' { |
| 175 | + stk = append(stk, c) |
| 176 | + } else if c == ')' { |
| 177 | + var t, f int |
| 178 | + for stk[len(stk)-1] == 't' || stk[len(stk)-1] == 'f' { |
| 179 | + if stk[len(stk)-1] == 't' { |
| 180 | + t++ |
| 181 | + } else { |
| 182 | + f++ |
| 183 | + } |
| 184 | + stk = stk[:len(stk)-1] |
| 185 | + } |
| 186 | + op := stk[len(stk)-1] |
| 187 | + stk = stk[:len(stk)-1] |
| 188 | + c = 'f' |
| 189 | + switch op { |
| 190 | + case '!': |
| 191 | + if f > 0 { |
| 192 | + c = 't' |
| 193 | + } |
| 194 | + case '&': |
| 195 | + if f == 0 { |
| 196 | + c = 't' |
| 197 | + } |
| 198 | + case '|': |
| 199 | + if t > 0 { |
| 200 | + c = 't' |
| 201 | + } |
| 202 | + } |
| 203 | + stk = append(stk, c) |
| 204 | + } |
| 205 | + } |
| 206 | + return stk[0] == 't' |
| 207 | +} |
77 | 208 | ```
|
78 | 209 |
|
79 | 210 | ### **...**
|
|
0 commit comments