Skip to content

Commit 601a3b9

Browse files
committed
feat: add solutions to lc problem: No.1106
No.1106.Parsing A Boolean Expression
1 parent cbad88a commit 601a3b9

File tree

6 files changed

+361
-2
lines changed

6 files changed

+361
-2
lines changed

solution/1100-1199/1106.Parsing A Boolean Expression/README.md

+132-1
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,153 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

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+
6174
<!-- tabs:start -->
6275

6376
### **Python3**
6477

6578
<!-- 这里可写当前语言的特殊实现逻辑 -->
6679

6780
```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'
69102
```
70103

71104
### **Java**
72105

73106
<!-- 这里可写当前语言的特殊实现逻辑 -->
74107

75108
```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+
```
76167
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+
}
77208
```
78209

79210
### **...**

solution/1100-1199/1106.Parsing A Boolean Expression/README_EN.md

+119-1
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,131 @@ Then, evaluate !(f) --&gt; NOT false --&gt; true. We return true.
6363
### **Python3**
6464

6565
```python
66-
66+
class Solution:
67+
def parseBoolExpr(self, expression: str) -> bool:
68+
stk = []
69+
for c in expression:
70+
if c in 'tf!&|':
71+
stk.append(c)
72+
elif c == ')':
73+
t = f = 0
74+
while stk[-1] in 'tf':
75+
t += stk[-1] == 't'
76+
f += stk[-1] == 'f'
77+
stk.pop()
78+
match stk.pop():
79+
case '!':
80+
c = 't' if f else 'f'
81+
case '&':
82+
c = 'f' if f else 't'
83+
case '|':
84+
c = 't' if t else 'f'
85+
stk.append(c)
86+
return stk[0] == 't'
6787
```
6888

6989
### **Java**
7090

7191
```java
92+
class Solution {
93+
public boolean parseBoolExpr(String expression) {
94+
Deque<Character> stk = new ArrayDeque<>();
95+
for (int i = 0; i < expression.length(); ++i) {
96+
char c = expression.charAt(i);
97+
if (c != '(' && c != ')' && c != ',') {
98+
stk.push(c);
99+
} else if (c == ')') {
100+
int t = 0, f = 0;
101+
while (stk.peek() == 't' || stk.peek() == 'f') {
102+
t += stk.peek() == 't' ? 1 : 0;
103+
f += stk.peek() == 'f' ? 1 : 0;
104+
stk.pop();
105+
}
106+
char op = stk.pop();
107+
if (op == '!') {
108+
c = f > 0 ? 't' : 'f';
109+
} else if (op == '&') {
110+
c = f > 0 ? 'f' : 't';
111+
} else {
112+
c = t > 0 ? 't' : 'f';
113+
}
114+
stk.push(c);
115+
}
116+
}
117+
return stk.peek() == 't';
118+
}
119+
}
120+
```
121+
122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
bool parseBoolExpr(string expression) {
128+
stack<char> stk;
129+
for (char c : expression) {
130+
if (c != '(' && c != ')' && c != ',') stk.push(c);
131+
else if (c == ')') {
132+
int t = 0, f = 0;
133+
while (stk.top() == 't' || stk.top() == 'f') {
134+
t += stk.top() == 't';
135+
f += stk.top() == 'f';
136+
stk.pop();
137+
}
138+
char op = stk.top();
139+
stk.pop();
140+
if (op == '!') c = f ? 't' : 'f';
141+
if (op == '&') c = f ? 'f' : 't';
142+
if (op == '|') c = t ? 't' : 'f';
143+
stk.push(c);
144+
}
145+
}
146+
return stk.top() == 't';
147+
}
148+
};
149+
```
72150
151+
### **Go**
152+
153+
```go
154+
func parseBoolExpr(expression string) bool {
155+
stk := []rune{}
156+
for _, c := range expression {
157+
if c != '(' && c != ')' && c != ',' {
158+
stk = append(stk, c)
159+
} else if c == ')' {
160+
var t, f int
161+
for stk[len(stk)-1] == 't' || stk[len(stk)-1] == 'f' {
162+
if stk[len(stk)-1] == 't' {
163+
t++
164+
} else {
165+
f++
166+
}
167+
stk = stk[:len(stk)-1]
168+
}
169+
op := stk[len(stk)-1]
170+
stk = stk[:len(stk)-1]
171+
c = 'f'
172+
switch op {
173+
case '!':
174+
if f > 0 {
175+
c = 't'
176+
}
177+
case '&':
178+
if f == 0 {
179+
c = 't'
180+
}
181+
case '|':
182+
if t > 0 {
183+
c = 't'
184+
}
185+
}
186+
stk = append(stk, c)
187+
}
188+
}
189+
return stk[0] == 't'
190+
}
73191
```
74192

75193
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public:
3+
bool parseBoolExpr(string expression) {
4+
stack<char> stk;
5+
for (char c : expression) {
6+
if (c != '(' && c != ')' && c != ',') stk.push(c);
7+
else if (c == ')') {
8+
int t = 0, f = 0;
9+
while (stk.top() == 't' || stk.top() == 'f') {
10+
t += stk.top() == 't';
11+
f += stk.top() == 'f';
12+
stk.pop();
13+
}
14+
char op = stk.top();
15+
stk.pop();
16+
if (op == '!') c = f ? 't' : 'f';
17+
if (op == '&') c = f ? 'f' : 't';
18+
if (op == '|') c = t ? 't' : 'f';
19+
stk.push(c);
20+
}
21+
}
22+
return stk.top() == 't';
23+
}
24+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
func parseBoolExpr(expression string) bool {
2+
stk := []rune{}
3+
for _, c := range expression {
4+
if c != '(' && c != ')' && c != ',' {
5+
stk = append(stk, c)
6+
} else if c == ')' {
7+
var t, f int
8+
for stk[len(stk)-1] == 't' || stk[len(stk)-1] == 'f' {
9+
if stk[len(stk)-1] == 't' {
10+
t++
11+
} else {
12+
f++
13+
}
14+
stk = stk[:len(stk)-1]
15+
}
16+
op := stk[len(stk)-1]
17+
stk = stk[:len(stk)-1]
18+
c = 'f'
19+
switch op {
20+
case '!':
21+
if f > 0 {
22+
c = 't'
23+
}
24+
case '&':
25+
if f == 0 {
26+
c = 't'
27+
}
28+
case '|':
29+
if t > 0 {
30+
c = 't'
31+
}
32+
}
33+
stk = append(stk, c)
34+
}
35+
}
36+
return stk[0] == 't'
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public boolean parseBoolExpr(String expression) {
3+
Deque<Character> stk = new ArrayDeque<>();
4+
for (int i = 0; i < expression.length(); ++i) {
5+
char c = expression.charAt(i);
6+
if (c != '(' && c != ')' && c != ',') {
7+
stk.push(c);
8+
} else if (c == ')') {
9+
int t = 0, f = 0;
10+
while (stk.peek() == 't' || stk.peek() == 'f') {
11+
t += stk.peek() == 't' ? 1 : 0;
12+
f += stk.peek() == 'f' ? 1 : 0;
13+
stk.pop();
14+
}
15+
char op = stk.pop();
16+
if (op == '!') {
17+
c = f > 0 ? 't' : 'f';
18+
} else if (op == '&') {
19+
c = f > 0 ? 'f' : 't';
20+
} else {
21+
c = t > 0 ? 't' : 'f';
22+
}
23+
stk.push(c);
24+
}
25+
}
26+
return stk.peek() == 't';
27+
}
28+
}

0 commit comments

Comments
 (0)