Skip to content

Commit faf59bf

Browse files
committed
feat: add solutions to lcci problem: No.08.14
lcci No.08.14.Boolean Evaluation
1 parent f34e71c commit faf59bf

File tree

6 files changed

+452
-2
lines changed

6 files changed

+452
-2
lines changed

lcci/08.14.Boolean Evaluation/README.md

Lines changed: 155 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,176 @@
3333

3434
<!-- 这里可写通用的实现逻辑 -->
3535

36+
**方法一:记忆化搜索**
37+
3638
<!-- tabs:start -->
3739

3840
### **Python3**
3941

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

4244
```python
43-
45+
class Solution:
46+
def countEval(self, s: str, result: int) -> int:
47+
@cache
48+
def dfs(s):
49+
res = [0] * 2
50+
if s in '01':
51+
res[int(s)] = 1
52+
return res
53+
for k, op in enumerate(s):
54+
if op in '&^|':
55+
left, right = dfs(s[:k]), dfs(s[k + 1:])
56+
for i, v1 in enumerate(left):
57+
for j, v2 in enumerate(right):
58+
if op == '&':
59+
v = i & j
60+
elif op == '^':
61+
v = i ^ j
62+
elif op == '|':
63+
v = i | j
64+
res[v] += v1 * v2
65+
return res
66+
67+
ans = dfs(s)
68+
return ans[result] if 0 <= result < 2 else 0
4469
```
4570

4671
### **Java**
4772

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

5075
```java
76+
class Solution {
77+
private Map<String, int[]> memo;
78+
79+
public int countEval(String s, int result) {
80+
memo = new HashMap<>();
81+
int[] ans = dfs(s);
82+
return result == 0 || result == 1 ? ans[result] : 0;
83+
}
84+
85+
private int[] dfs(String s) {
86+
if (memo.containsKey(s)) {
87+
return memo.get(s);
88+
}
89+
int[] res = new int[2];
90+
if (s.length() == 1) {
91+
res[Integer.parseInt(s)] = 1;
92+
return res;
93+
}
94+
for (int k = 0; k < s.length(); ++k) {
95+
char op = s.charAt(k);
96+
if (op == '&' || op == '|' || op == '^') {
97+
int[] left = dfs(s.substring(0, k));
98+
int[] right = dfs(s.substring(k + 1));
99+
for (int i = 0; i < 2; ++i) {
100+
for (int j = 0; j < 2; ++j) {
101+
int v = 0;
102+
if (op == '&') {
103+
v = i & j;
104+
} else if (op == '|') {
105+
v = i | j;
106+
} else if (op == '^') {
107+
v = i ^ j;
108+
}
109+
res[v] += left[i] * right[j];
110+
}
111+
}
112+
}
113+
}
114+
memo.put(s, res);
115+
return res;
116+
}
117+
}
118+
```
119+
120+
### **C++**
121+
122+
```cpp
123+
class Solution {
124+
public:
125+
unordered_map<string, vector<int>> memo;
126+
127+
int countEval(string s, int result) {
128+
vector<int> ans = dfs(s);
129+
return result == 0 || result == 1 ? ans[result] : 0;
130+
}
131+
132+
vector<int> dfs(string s) {
133+
if (memo.count(s)) return memo[s];
134+
vector<int> res(2);
135+
if (s.size() == 1)
136+
{
137+
res[s[0] - '0'] = 1;
138+
return res;
139+
}
140+
for (int k = 0; k < s.size(); ++k)
141+
{
142+
if (s[k] == '0' || s[k] == '1') continue;
143+
vector<int> left = dfs(s.substr(0, k));
144+
vector<int> right = dfs(s.substr(k + 1, s.size() - k));
145+
for (int i = 0; i < 2; ++i)
146+
{
147+
for (int j = 0; j < 2; ++j)
148+
{
149+
int v = 0;
150+
if (s[k] == '&') v = i & j;
151+
else if (s[k] == '|') v = i | j;
152+
else if (s[k] == '^') v = i ^ j;
153+
res[v] += left[i] * right[j];
154+
}
155+
}
156+
}
157+
memo[s] = res;
158+
return res;
159+
}
160+
};
161+
```
51162
163+
### **Go**
164+
165+
```go
166+
func countEval(s string, result int) int {
167+
memo := map[string][]int{}
168+
var dfs func(string) []int
169+
dfs = func(s string) []int {
170+
if v, ok := memo[s]; ok {
171+
return v
172+
}
173+
res := make([]int, 2)
174+
if len(s) == 1 {
175+
res[s[0]-'0'] = 1
176+
return res
177+
}
178+
for k, c := range s {
179+
if c == '0' || c == '1' {
180+
continue
181+
}
182+
left, right := dfs(s[:k]), dfs(s[k+1:])
183+
for i, v1 := range left {
184+
for j, v2 := range right {
185+
v := 0
186+
if c == '&' {
187+
v = i & j
188+
} else if c == '|' {
189+
v = i | j
190+
} else if c == '^' {
191+
v = i ^ j
192+
}
193+
res[v] += v1 * v2
194+
}
195+
}
196+
}
197+
memo[s] = res
198+
return res
199+
}
200+
ans := dfs(s)
201+
if result == 0 || result == 1 {
202+
return ans[result]
203+
}
204+
return 0
205+
}
52206
```
53207

54208
### **...**

lcci/08.14.Boolean Evaluation/README_EN.md

Lines changed: 153 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,165 @@
4747
### **Python3**
4848

4949
```python
50-
50+
class Solution:
51+
def countEval(self, s: str, result: int) -> int:
52+
@cache
53+
def dfs(s):
54+
res = [0] * 2
55+
if s in '01':
56+
res[int(s)] = 1
57+
return res
58+
for k, op in enumerate(s):
59+
if op in '&^|':
60+
left, right = dfs(s[:k]), dfs(s[k + 1:])
61+
for i, v1 in enumerate(left):
62+
for j, v2 in enumerate(right):
63+
if op == '&':
64+
v = i & j
65+
elif op == '^':
66+
v = i ^ j
67+
elif op == '|':
68+
v = i | j
69+
res[v] += v1 * v2
70+
return res
71+
72+
ans = dfs(s)
73+
return ans[result] if 0 <= result < 2 else 0
5174
```
5275

5376
### **Java**
5477

5578
```java
79+
class Solution {
80+
private Map<String, int[]> memo;
81+
82+
public int countEval(String s, int result) {
83+
memo = new HashMap<>();
84+
int[] ans = dfs(s);
85+
return result == 0 || result == 1 ? ans[result] : 0;
86+
}
87+
88+
private int[] dfs(String s) {
89+
if (memo.containsKey(s)) {
90+
return memo.get(s);
91+
}
92+
int[] res = new int[2];
93+
if (s.length() == 1) {
94+
res[Integer.parseInt(s)] = 1;
95+
return res;
96+
}
97+
for (int k = 0; k < s.length(); ++k) {
98+
char op = s.charAt(k);
99+
if (op == '&' || op == '|' || op == '^') {
100+
int[] left = dfs(s.substring(0, k));
101+
int[] right = dfs(s.substring(k + 1));
102+
for (int i = 0; i < 2; ++i) {
103+
for (int j = 0; j < 2; ++j) {
104+
int v = 0;
105+
if (op == '&') {
106+
v = i & j;
107+
} else if (op == '|') {
108+
v = i | j;
109+
} else if (op == '^') {
110+
v = i ^ j;
111+
}
112+
res[v] += left[i] * right[j];
113+
}
114+
}
115+
}
116+
}
117+
memo.put(s, res);
118+
return res;
119+
}
120+
}
121+
```
122+
123+
### **C++**
124+
125+
```cpp
126+
class Solution {
127+
public:
128+
unordered_map<string, vector<int>> memo;
129+
130+
int countEval(string s, int result) {
131+
vector<int> ans = dfs(s);
132+
return result == 0 || result == 1 ? ans[result] : 0;
133+
}
134+
135+
vector<int> dfs(string s) {
136+
if (memo.count(s)) return memo[s];
137+
vector<int> res(2);
138+
if (s.size() == 1)
139+
{
140+
res[s[0] - '0'] = 1;
141+
return res;
142+
}
143+
for (int k = 0; k < s.size(); ++k)
144+
{
145+
if (s[k] == '0' || s[k] == '1') continue;
146+
vector<int> left = dfs(s.substr(0, k));
147+
vector<int> right = dfs(s.substr(k + 1, s.size() - k));
148+
for (int i = 0; i < 2; ++i)
149+
{
150+
for (int j = 0; j < 2; ++j)
151+
{
152+
int v = 0;
153+
if (s[k] == '&') v = i & j;
154+
else if (s[k] == '|') v = i | j;
155+
else if (s[k] == '^') v = i ^ j;
156+
res[v] += left[i] * right[j];
157+
}
158+
}
159+
}
160+
memo[s] = res;
161+
return res;
162+
}
163+
};
164+
```
56165
166+
### **Go**
167+
168+
```go
169+
func countEval(s string, result int) int {
170+
memo := map[string][]int{}
171+
var dfs func(string) []int
172+
dfs = func(s string) []int {
173+
if v, ok := memo[s]; ok {
174+
return v
175+
}
176+
res := make([]int, 2)
177+
if len(s) == 1 {
178+
res[s[0]-'0'] = 1
179+
return res
180+
}
181+
for k, c := range s {
182+
if c == '0' || c == '1' {
183+
continue
184+
}
185+
left, right := dfs(s[:k]), dfs(s[k+1:])
186+
for i, v1 := range left {
187+
for j, v2 := range right {
188+
v := 0
189+
if c == '&' {
190+
v = i & j
191+
} else if c == '|' {
192+
v = i | j
193+
} else if c == '^' {
194+
v = i ^ j
195+
}
196+
res[v] += v1 * v2
197+
}
198+
}
199+
}
200+
memo[s] = res
201+
return res
202+
}
203+
ans := dfs(s)
204+
if result == 0 || result == 1 {
205+
return ans[result]
206+
}
207+
return 0
208+
}
57209
```
58210

59211
### **...**
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
public:
3+
unordered_map<string, vector<int>> memo;
4+
5+
int countEval(string s, int result) {
6+
vector<int> ans = dfs(s);
7+
return result == 0 || result == 1 ? ans[result] : 0;
8+
}
9+
10+
vector<int> dfs(string s) {
11+
if (memo.count(s)) return memo[s];
12+
vector<int> res(2);
13+
if (s.size() == 1)
14+
{
15+
res[s[0] - '0'] = 1;
16+
return res;
17+
}
18+
for (int k = 0; k < s.size(); ++k)
19+
{
20+
if (s[k] == '0' || s[k] == '1') continue;
21+
vector<int> left = dfs(s.substr(0, k));
22+
vector<int> right = dfs(s.substr(k + 1, s.size() - k));
23+
for (int i = 0; i < 2; ++i)
24+
{
25+
for (int j = 0; j < 2; ++j)
26+
{
27+
int v = 0;
28+
if (s[k] == '&') v = i & j;
29+
else if (s[k] == '|') v = i | j;
30+
else if (s[k] == '^') v = i ^ j;
31+
res[v] += left[i] * right[j];
32+
}
33+
}
34+
}
35+
memo[s] = res;
36+
return res;
37+
}
38+
};

0 commit comments

Comments
 (0)