Skip to content

Commit 159cf55

Browse files
committed
feat: add solutions to leetcode problem: No.1807. Evaluate the Bracket Pairs of a String
1 parent fefbad4 commit 159cf55

File tree

4 files changed

+157
-6
lines changed

4 files changed

+157
-6
lines changed

solution/1800-1899/1807.Evaluate the Bracket Pairs of a String/README.md

+57-3
Original file line numberDiff line numberDiff line change
@@ -74,27 +74,81 @@
7474
<li><code>knowledge</code> 中的 <code>key<sub>i</sub></code> 不会重复。</li>
7575
</ul>
7676

77-
7877
## 解法
7978

8079
<!-- 这里可写通用的实现逻辑 -->
8180

81+
先将 `knowledge` 转为哈希字典。
82+
83+
然后遍历字符串每个字符 `s[i]`
84+
85+
-`s[i] == '('`,说明遇到了左括号,因此要找到右括号 `)` 的位置,然后截取括号间的子串作为 `key`,在哈希字典中查找 `key` 对应的 `value`,有则追加 `value` 到结果中,没有则追加 `?`,然后指针跳到右括号位置的下一个位置;
86+
-`s[i]` 是其他字符,则正常追加即可。
87+
8288
<!-- tabs:start -->
8389

8490
### **Python3**
8591

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

8894
```python
89-
95+
class Solution:
96+
def evaluate(self, s: str, knowledge: List[List[str]]) -> str:
97+
def find_right_bracket(s, start, end):
98+
for i in range(start, end):
99+
if s[i] == ')':
100+
return i
101+
knowledge_dict = {item[0]: item[1] for item in knowledge}
102+
res, n = [], len(s)
103+
i = 0
104+
while i < n:
105+
if s[i] == '(':
106+
right_bracket_pos = find_right_bracket(s, i + 1, n)
107+
key = s[i + 1: right_bracket_pos]
108+
res.append(knowledge_dict.get(key, '?'))
109+
i = right_bracket_pos + 1
110+
else:
111+
res.append(s[i])
112+
i += 1
113+
return ''.join(res)
90114
```
91115

92116
### **Java**
93117

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

96120
```java
97-
121+
class Solution {
122+
public String evaluate(String s, List<List<String>> knowledge) {
123+
Map<String, String> knowledgeDict = new HashMap<>();
124+
for (List<String> item : knowledge) {
125+
knowledgeDict.put(item.get(0), item.get(1));
126+
}
127+
StringBuilder res = new StringBuilder();
128+
int i = 0, n = s.length();
129+
while (i < n) {
130+
if (s.charAt(i) == '(') {
131+
int rightBracketPos = findRightBracket(s, i + 1, n);
132+
String key = s.substring(i + 1, rightBracketPos);
133+
res.append(knowledgeDict.getOrDefault(key, "?"));
134+
i = rightBracketPos + 1;
135+
} else {
136+
res.append(s.charAt(i));
137+
i += 1;
138+
}
139+
}
140+
return res.toString();
141+
}
142+
143+
private int findRightBracket(String s, int start, int end) {
144+
for (int i = start; i < end; ++i) {
145+
if (s.charAt(i) == ')') {
146+
return i;
147+
}
148+
}
149+
return -1;
150+
}
151+
}
98152
```
99153

100154
### **...**

solution/1800-1899/1807.Evaluate the Bracket Pairs of a String/README_EN.md

+50-3
Original file line numberDiff line numberDiff line change
@@ -74,21 +74,68 @@ Notice that the &quot;a&quot;s not in a bracket pair are not evaluated.
7474
<li>Each <code>key<sub>i</sub></code> in <code>knowledge</code> is unique.</li>
7575
</ul>
7676

77-
7877
## Solutions
7978

8079
<!-- tabs:start -->
8180

8281
### **Python3**
8382

8483
```python
85-
84+
class Solution:
85+
def evaluate(self, s: str, knowledge: List[List[str]]) -> str:
86+
def find_right_bracket(s, start, end):
87+
for i in range(start, end):
88+
if s[i] == ')':
89+
return i
90+
knowledge_dict = {item[0]: item[1] for item in knowledge}
91+
res, n = [], len(s)
92+
i = 0
93+
while i < n:
94+
if s[i] == '(':
95+
right_bracket_pos = find_right_bracket(s, i + 1, n)
96+
key = s[i + 1: right_bracket_pos]
97+
res.append(knowledge_dict.get(key, '?'))
98+
i = right_bracket_pos + 1
99+
else:
100+
res.append(s[i])
101+
i += 1
102+
return ''.join(res)
86103
```
87104

88105
### **Java**
89106

90107
```java
91-
108+
class Solution {
109+
public String evaluate(String s, List<List<String>> knowledge) {
110+
Map<String, String> knowledgeDict = new HashMap<>();
111+
for (List<String> item : knowledge) {
112+
knowledgeDict.put(item.get(0), item.get(1));
113+
}
114+
StringBuilder res = new StringBuilder();
115+
int i = 0, n = s.length();
116+
while (i < n) {
117+
if (s.charAt(i) == '(') {
118+
int rightBracketPos = findRightBracket(s, i + 1, n);
119+
String key = s.substring(i + 1, rightBracketPos);
120+
res.append(knowledgeDict.getOrDefault(key, "?"));
121+
i = rightBracketPos + 1;
122+
} else {
123+
res.append(s.charAt(i));
124+
i += 1;
125+
}
126+
}
127+
return res.toString();
128+
}
129+
130+
private int findRightBracket(String s, int start, int end) {
131+
for (int i = start; i < end; ++i) {
132+
if (s.charAt(i) == ')') {
133+
return i;
134+
}
135+
}
136+
return -1;
137+
}
138+
}
92139
```
93140

94141
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution {
2+
public String evaluate(String s, List<List<String>> knowledge) {
3+
Map<String, String> knowledgeDict = new HashMap<>();
4+
for (List<String> item : knowledge) {
5+
knowledgeDict.put(item.get(0), item.get(1));
6+
}
7+
StringBuilder res = new StringBuilder();
8+
int i = 0, n = s.length();
9+
while (i < n) {
10+
if (s.charAt(i) == '(') {
11+
int rightBracketPos = findRightBracket(s, i + 1, n);
12+
String key = s.substring(i + 1, rightBracketPos);
13+
res.append(knowledgeDict.getOrDefault(key, "?"));
14+
i = rightBracketPos + 1;
15+
} else {
16+
res.append(s.charAt(i));
17+
i += 1;
18+
}
19+
}
20+
return res.toString();
21+
}
22+
23+
private int findRightBracket(String s, int start, int end) {
24+
for (int i = start; i < end; ++i) {
25+
if (s.charAt(i) == ')') {
26+
return i;
27+
}
28+
}
29+
return -1;
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution:
2+
def evaluate(self, s: str, knowledge: List[List[str]]) -> str:
3+
def find_right_bracket(s, start, end):
4+
for i in range(start, end):
5+
if s[i] == ')':
6+
return i
7+
knowledge_dict = {item[0]: item[1] for item in knowledge}
8+
res, n = [], len(s)
9+
i = 0
10+
while i < n:
11+
if s[i] == '(':
12+
right_bracket_pos = find_right_bracket(s, i + 1, n)
13+
key = s[i + 1: right_bracket_pos]
14+
res.append(knowledge_dict.get(key, '?'))
15+
i = right_bracket_pos + 1
16+
else:
17+
res.append(s[i])
18+
i += 1
19+
return ''.join(res)

0 commit comments

Comments
 (0)