Skip to content

Commit ff4082e

Browse files
committed
feat: add solutions to lc problem: No.0736
No.0736.Parse Lisp Expression
1 parent c162318 commit ff4082e

File tree

5 files changed

+613
-0
lines changed

5 files changed

+613
-0
lines changed

solution/0700-0799/0736.Parse Lisp Expression/README.md

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,22 +66,230 @@
6666

6767
<!-- 这里可写通用的实现逻辑 -->
6868

69+
**方法一:递归**
70+
71+
时间复杂度 $O(n)$。
72+
6973
<!-- tabs:start -->
7074

7175
### **Python3**
7276

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

7579
```python
80+
class Solution:
81+
def evaluate(self, expression: str) -> int:
82+
def parseVar():
83+
nonlocal i
84+
j = i
85+
while i < n and expression[i] not in " )":
86+
i += 1
87+
return expression[j:i]
88+
89+
def parseInt():
90+
nonlocal i
91+
sign, v = 1, 0
92+
if expression[i] == "-":
93+
sign = -1
94+
i += 1
95+
while i < n and expression[i].isdigit():
96+
v = v * 10 + int(expression[i])
97+
i += 1
98+
return sign * v
99+
100+
def eval():
101+
nonlocal i
102+
if expression[i] != "(":
103+
return scope[parseVar()][-1] if expression[i].islower() else parseInt()
104+
i += 1
105+
if expression[i] == "l":
106+
i += 4
107+
vars = []
108+
while 1:
109+
var = parseVar()
110+
if expression[i] == ")":
111+
ans = scope[var][-1]
112+
break
113+
vars.append(var)
114+
i += 1
115+
scope[var].append(eval())
116+
i += 1
117+
if not expression[i].islower():
118+
ans = eval()
119+
break
120+
for v in vars:
121+
scope[v].pop()
122+
else:
123+
add = expression[i] == "a"
124+
i += 4 if add else 5
125+
a = eval()
126+
i += 1
127+
b = eval()
128+
ans = a + b if add else a * b
129+
i += 1
130+
return ans
76131

132+
i, n = 0, len(expression)
133+
scope = defaultdict(list)
134+
return eval()
77135
```
78136

79137
### **Java**
80138

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

83141
```java
142+
class Solution {
143+
private int i;
144+
private String expr;
145+
private Map<String, Deque<Integer>> scope = new HashMap<>();
146+
147+
public int evaluate(String expression) {
148+
expr = expression;
149+
return eval();
150+
}
151+
152+
private int eval() {
153+
char c = expr.charAt(i);
154+
if (c != '(') {
155+
return Character.isLowerCase(c) ? scope.get(parseVar()).peekLast() : parseInt();
156+
}
157+
++i;
158+
c = expr.charAt(i);
159+
int ans = 0;
160+
if (c == 'l') {
161+
i += 4;
162+
List<String> vars = new ArrayList<>();
163+
while (true) {
164+
String var = parseVar();
165+
if (expr.charAt(i) == ')') {
166+
ans = scope.get(var).peekLast();
167+
break;
168+
}
169+
vars.add(var);
170+
++i;
171+
scope.computeIfAbsent(var, k -> new ArrayDeque<>()).offer(eval());
172+
++i;
173+
if (!Character.isLowerCase(expr.charAt(i))) {
174+
ans = eval();
175+
break;
176+
}
177+
}
178+
for (String v : vars) {
179+
scope.get(v).pollLast();
180+
}
181+
} else {
182+
boolean add = c == 'a';
183+
i += add ? 4 : 5;
184+
int a = eval();
185+
++i;
186+
int b = eval();
187+
ans = add ? a + b : a * b;
188+
}
189+
++i;
190+
return ans;
191+
}
192+
193+
private String parseVar() {
194+
int j = i;
195+
while (i < expr.length() && expr.charAt(i) != ' ' && expr.charAt(i) != ')') {
196+
++i;
197+
}
198+
return expr.substring(j, i);
199+
}
200+
201+
private int parseInt() {
202+
int sign = 1;
203+
if (expr.charAt(i) == '-') {
204+
sign = -1;
205+
++i;
206+
}
207+
int v = 0;
208+
while (i < expr.length() && Character.isDigit(expr.charAt(i))) {
209+
v = v * 10 + (expr.charAt(i) - '0');
210+
++i;
211+
}
212+
return sign * v;
213+
}
214+
}
215+
```
216+
217+
### **C++**
218+
219+
```cpp
220+
class Solution {
221+
public:
222+
int i = 0;
223+
string expr;
224+
unordered_map<string, vector<int>> scope;
225+
226+
int evaluate(string expression) {
227+
expr = expression;
228+
return eval();
229+
}
230+
231+
int eval() {
232+
if (expr[i] != '(') return islower(expr[i]) ? scope[parseVar()].back() : parseInt();
233+
int ans = 0;
234+
++i;
235+
if (expr[i] == 'l')
236+
{
237+
i += 4;
238+
vector<string> vars;
239+
while (1)
240+
{
241+
string var = parseVar();
242+
if (expr[i] == ')')
243+
{
244+
ans = scope[var].back();
245+
break;
246+
}
247+
++i;
248+
vars.push_back(var);
249+
scope[var].push_back(eval());
250+
++i;
251+
if (!islower(expr[i]))
252+
{
253+
ans = eval();
254+
break;
255+
}
256+
}
257+
for (string v : vars) scope[v].pop_back();
258+
}
259+
else
260+
{
261+
bool add = expr[i] == 'a';
262+
i += add ? 4 : 5;
263+
int a = eval();
264+
++i;
265+
int b = eval();
266+
ans = add ? a + b : a * b;
267+
}
268+
++i;
269+
return ans;
270+
}
271+
272+
string parseVar() {
273+
int j = i;
274+
while (i < expr.size() && expr[i] != ' ' && expr[i] != ')') ++i;
275+
return expr.substr(j, i - j);
276+
}
84277

278+
int parseInt() {
279+
int sign = 1, v = 0;
280+
if (expr[i] == '-')
281+
{
282+
sign = -1;
283+
++i;
284+
}
285+
while (i < expr.size() && expr[i] >= '0' && expr[i] <= '9')
286+
{
287+
v = v * 10 + (expr[i] - '0');
288+
++i;
289+
}
290+
return sign * v;
291+
}
292+
};
85293
```
86294

87295
### **...**

0 commit comments

Comments
 (0)