Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 132 additions & 1 deletion
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‎

Lines changed: 119 additions & 1 deletion
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
### **...**
Lines changed: 24 additions & 0 deletions
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+
};
Lines changed: 37 additions & 0 deletions
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+
}
Lines changed: 28 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /