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 53119c8

Browse files
Merge pull request SharingSource#588 from SharingSource/ac_oier
✨feat: add 736
2 parents da6a055 + 8279ba0 commit 53119c8

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

‎LeetCode/731-740/736. Lisp 语法解析(困难).md‎

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Tag : 「DFS」、「模拟」、「哈希表」
1111
表达式语法如下所示:
1212

1313
* 表达式可以为整数,`let` 表达式,`add` 表达式,`mult` 表达式,或赋值的变量。表达式的结果总是一个整数。
14-
* (整数可以是正整数、负整数、0ドル$)
14+
* 整数可以是正整数、负整数、0ドル$
1515
* `let` 表达式采用 `"(let v1 e1 v2 e2 ... vn en expr)"` 的形式,其中 `let` 总是以字符串 `"let"`来表示,接下来会跟随一对或多对交替的变量和表达式,也就是说,第一个变量 `v1`被分配为表达式 `e1` 的值,第二个变量 `v2` 被分配为表达式 `e2` 的值,依次类推;最终 `let` 表达式的值为 `expr` 表达式的值。
1616
* `add` 表达式表示为 `"(add e1 e2)"` ,其中 `add` 总是以字符串 `"add"` 来表示,该表达式总是包含两个表达式 `e1``e2` ,最终结果是 `e1` 表达式的值与 `e2` 表达式的值之 和 。
1717
* `mult` 表达式表示为 `"(mult e1 e2)"` ,其中 `mult` 总是以字符串 `"mult"` 表示,该表达式总是包含两个表达式 `e1`、e2,最终结果是 `e1` 表达式的值与 `e2` 表达式的值之 积 。
@@ -20,12 +20,16 @@ Tag : 「DFS」、「模拟」、「哈希表」
2020

2121
示例 1:
2222

23+
```
2324
输入:expression = "(let x 2 (mult x (let x 3 y 4 (add x y))))"
25+
2426
输出:14
27+
2528
解释:
2629
计算表达式 (add x y), 在检查变量 x 值时,
2730
在变量的上下文中由最内层作用域依次向外检查。
2831
首先找到 x = 3, 所以此处的 x 值是 3 。
32+
```
2933
示例 2:
3034
```
3135
输入:expression = "(let x 3 x 2 x)"
@@ -57,7 +61,7 @@ Tag : 「DFS」、「模拟」、「哈希表」
5761

5862
今天身体不舒服,不写太详细,题目不难,大家结合代码看吧。
5963

60-
设计函数 `int dfs(int l, int r, Map<String, Integer> map)` 函数,代表计算 $s[l...r]$ 的结果,答案为 `dfs(0,n-1,map)`,其中 $n$ 为字符串的长度。
64+
设计函数 `int dfs(int l, int r, Map<String, Integer> map)`,代表计算 $s[l...r]$ 的结果,答案为 `dfs(0,n-1,map)`,其中 $n$ 为字符串的长度。
6165

6266
根据传入的 $[l, r]$ 是否为表达式分情况讨论:
6367

@@ -96,7 +100,7 @@ class Solution {
96100
int idx = l;
97101
while (cs[idx] != ' ') idx++;
98102
String op = s.substring(l + 1, idx);
99-
r--;// 判别为 "(let"、"(add" 或 "(mult" 后,跳过对应的 ")"
103+
r--;
100104
if (op.equals("let")) {
101105
for (int i = idx + 1; i <= r; ) {
102106
int j = getRight(i, r);
@@ -109,14 +113,10 @@ class Solution {
109113
i = j + 1;
110114
}
111115
return -1; // never
112-
} else if (op.equals("add")) {
113-
int j = getRight(idx + 1, r);
114-
int a = dfs(idx + 1, j - 1, new HashMap<>(map)), b = dfs(j + 1, r, new HashMap<>(map));
115-
return a + b;
116116
} else {
117117
int j = getRight(idx + 1, r);
118118
int a = dfs(idx + 1, j - 1, new HashMap<>(map)), b = dfs(j + 1, r, new HashMap<>(map));
119-
return a * b;
119+
return op.equals("add") ? a + b :a * b;
120120
}
121121
} else {
122122
String cur = s.substring(l, r + 1);
@@ -156,4 +156,3 @@ class Solution {
156156
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode
157157

158158
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
159-

0 commit comments

Comments
(0)

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