Skip to content

Commit e7fdf45

Browse files
committed
feat: add solutions to lc problem: No.1807
No.1807.Evaluate the Bracket Pairs of a String
1 parent 31b4fd9 commit e7fdf45

File tree

6 files changed

+218
-101
lines changed

6 files changed

+218
-101
lines changed

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

Lines changed: 78 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,13 @@
7676

7777
<!-- 这里可写通用的实现逻辑 -->
7878

79-
先将 `knowledge` 转为哈希字典。
79+
**方法一:哈希表 + 模拟**
8080

81-
然后遍历字符串每个字符 `s[i]`
81+
我们先用哈希表 `d` 记录 `knowledge` 中的键值对。
8282

83-
-`s[i] == '('`,说明遇到了左括号,因此要找到右括号 `)` 的位置,然后截取括号间的子串作为 `key`,在哈希字典中查找 `key` 对应的 `value`,有则追加 `value` 到结果中,没有则追加 `?`,然后指针跳到右括号位置的下一个位置;
84-
-`s[i]` 是其他字符,则正常追加即可。
83+
然后遍历字符串 `s`,如果当前字符是左括号 `(`,则从当前位置开始向后遍历,直到遇到右括号 `)`,此时括号内的字符串即为键,我们在哈希表 `d` 中查找该键对应的值,如果找到了,则将该值替换到括号内,否则替换为 `?`
84+
85+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 `s` 的长度。
8586

8687
<!-- tabs:start -->
8788

@@ -92,24 +93,18 @@
9293
```python
9394
class Solution:
9495
def evaluate(self, s: str, knowledge: List[List[str]]) -> str:
95-
def find_right_bracket(s, start, end):
96-
for i in range(start, end):
97-
if s[i] == ')':
98-
return i
99-
100-
knowledge_dict = {item[0]: item[1] for item in knowledge}
101-
res, n = [], len(s)
102-
i = 0
96+
d = {a: b for a, b in knowledge}
97+
i, n = 0, len(s)
98+
ans = []
10399
while i < n:
104100
if s[i] == '(':
105-
right_bracket_pos = find_right_bracket(s, i + 1, n)
106-
key = s[i + 1 : right_bracket_pos]
107-
res.append(knowledge_dict.get(key, '?'))
108-
i = right_bracket_pos + 1
101+
j = s.find(')', i + 1)
102+
ans.append(d.get(s[i + 1: j], '?'))
103+
i = j
109104
else:
110-
res.append(s[i])
111-
i += 1
112-
return ''.join(res)
105+
ans.append(s[i])
106+
i += 1
107+
return ''.join(ans)
113108
```
114109

115110
### **Java**
@@ -119,34 +114,82 @@ class Solution:
119114
```java
120115
class Solution {
121116
public String evaluate(String s, List<List<String>> knowledge) {
122-
Map<String, String> knowledgeDict = new HashMap<>();
123-
for (List<String> item : knowledge) {
124-
knowledgeDict.put(item.get(0), item.get(1));
117+
Map<String, String> d = new HashMap<>(knowledge.size());
118+
for (var e : knowledge) {
119+
d.put(e.get(0), e.get(1));
125120
}
126-
StringBuilder res = new StringBuilder();
121+
StringBuilder ans = new StringBuilder();
127122
int i = 0, n = s.length();
128123
while (i < n) {
129124
if (s.charAt(i) == '(') {
130-
int rightBracketPos = findRightBracket(s, i + 1, n);
131-
String key = s.substring(i + 1, rightBracketPos);
132-
res.append(knowledgeDict.getOrDefault(key, "?"));
133-
i = rightBracketPos + 1;
125+
int j = s.indexOf(')', i + 1);
126+
ans.append(d.getOrDefault(s.substring(i + 1, j), "?"));
127+
i = j;
134128
} else {
135-
res.append(s.charAt(i));
136-
i += 1;
129+
ans.append(s.charAt(i));
137130
}
131+
++i;
138132
}
139-
return res.toString();
133+
return ans.toString();
140134
}
135+
}
136+
```
141137

142-
private int findRightBracket(String s, int start, int end) {
143-
for (int i = start; i < end; ++i) {
144-
if (s.charAt(i) == ')') {
145-
return i;
138+
### **C++**
139+
140+
```cpp
141+
class Solution {
142+
public:
143+
string evaluate(string s, vector<vector<string>>& knowledge) {
144+
unordered_map<string, string> d;
145+
for (auto& e : knowledge) {
146+
d[e[0]] = e[1];
147+
}
148+
string ans;
149+
int i = 0, n = s.size();
150+
while (i < n) {
151+
if (s[i] == '(') {
152+
int j = s.find(")", i + 1);
153+
auto t = s.substr(i + 1, j - i - 1);
154+
ans += d.count(t) ? d[t] : "?";
155+
i = j;
156+
} else {
157+
ans += s[i];
146158
}
159+
++i;
147160
}
148-
return -1;
161+
return ans;
149162
}
163+
};
164+
```
165+
166+
### **Go**
167+
168+
```go
169+
func evaluate(s string, knowledge [][]string) string {
170+
d := map[string]string{}
171+
for _, v := range knowledge {
172+
d[v[0]] = v[1]
173+
}
174+
var ans strings.Builder
175+
i, n := 0, len(s)
176+
for ; i < n; i++ {
177+
if s[i] == '(' {
178+
j := i + 1
179+
for s[j] != ')' {
180+
j++
181+
}
182+
if v, ok := d[s[i+1:j]]; ok {
183+
ans.WriteString(v)
184+
} else {
185+
ans.WriteByte('?')
186+
}
187+
i = j
188+
} else {
189+
ans.WriteByte(s[i])
190+
}
191+
}
192+
return ans.String()
150193
}
151194
```
152195

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

Lines changed: 73 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -77,59 +77,101 @@ Notice that the &quot;a&quot;s not in a bracket pair are not evaluated.
7777
```python
7878
class Solution:
7979
def evaluate(self, s: str, knowledge: List[List[str]]) -> str:
80-
def find_right_bracket(s, start, end):
81-
for i in range(start, end):
82-
if s[i] == ')':
83-
return i
84-
85-
knowledge_dict = {item[0]: item[1] for item in knowledge}
86-
res, n = [], len(s)
87-
i = 0
80+
d = {a: b for a, b in knowledge}
81+
i, n = 0, len(s)
82+
ans = []
8883
while i < n:
8984
if s[i] == '(':
90-
right_bracket_pos = find_right_bracket(s, i + 1, n)
91-
key = s[i + 1 : right_bracket_pos]
92-
res.append(knowledge_dict.get(key, '?'))
93-
i = right_bracket_pos + 1
85+
j = s.find(')', i + 1)
86+
ans.append(d.get(s[i + 1: j], '?'))
87+
i = j
9488
else:
95-
res.append(s[i])
96-
i += 1
97-
return ''.join(res)
89+
ans.append(s[i])
90+
i += 1
91+
return ''.join(ans)
9892
```
9993

10094
### **Java**
10195

10296
```java
10397
class Solution {
10498
public String evaluate(String s, List<List<String>> knowledge) {
105-
Map<String, String> knowledgeDict = new HashMap<>();
106-
for (List<String> item : knowledge) {
107-
knowledgeDict.put(item.get(0), item.get(1));
99+
Map<String, String> d = new HashMap<>(knowledge.size());
100+
for (var e : knowledge) {
101+
d.put(e.get(0), e.get(1));
108102
}
109-
StringBuilder res = new StringBuilder();
103+
StringBuilder ans = new StringBuilder();
110104
int i = 0, n = s.length();
111105
while (i < n) {
112106
if (s.charAt(i) == '(') {
113-
int rightBracketPos = findRightBracket(s, i + 1, n);
114-
String key = s.substring(i + 1, rightBracketPos);
115-
res.append(knowledgeDict.getOrDefault(key, "?"));
116-
i = rightBracketPos + 1;
107+
int j = s.indexOf(')', i + 1);
108+
ans.append(d.getOrDefault(s.substring(i + 1, j), "?"));
109+
i = j;
117110
} else {
118-
res.append(s.charAt(i));
119-
i += 1;
111+
ans.append(s.charAt(i));
120112
}
113+
++i;
121114
}
122-
return res.toString();
115+
return ans.toString();
123116
}
117+
}
118+
```
119+
120+
### **C++**
124121

125-
private int findRightBracket(String s, int start, int end) {
126-
for (int i = start; i < end; ++i) {
127-
if (s.charAt(i) == ')') {
128-
return i;
122+
```cpp
123+
class Solution {
124+
public:
125+
string evaluate(string s, vector<vector<string>>& knowledge) {
126+
unordered_map<string, string> d;
127+
for (auto& e : knowledge) {
128+
d[e[0]] = e[1];
129+
}
130+
string ans;
131+
int i = 0, n = s.size();
132+
while (i < n) {
133+
if (s[i] == '(') {
134+
int j = s.find(")", i + 1);
135+
auto t = s.substr(i + 1, j - i - 1);
136+
ans += d.count(t) ? d[t] : "?";
137+
i = j;
138+
} else {
139+
ans += s[i];
129140
}
141+
++i;
130142
}
131-
return -1;
143+
return ans;
132144
}
145+
};
146+
```
147+
148+
### **Go**
149+
150+
```go
151+
func evaluate(s string, knowledge [][]string) string {
152+
d := map[string]string{}
153+
for _, v := range knowledge {
154+
d[v[0]] = v[1]
155+
}
156+
var ans strings.Builder
157+
i, n := 0, len(s)
158+
for ; i < n; i++ {
159+
if s[i] == '(' {
160+
j := i + 1
161+
for s[j] != ')' {
162+
j++
163+
}
164+
if v, ok := d[s[i+1:j]]; ok {
165+
ans.WriteString(v)
166+
} else {
167+
ans.WriteByte('?')
168+
}
169+
i = j
170+
} else {
171+
ans.WriteByte(s[i])
172+
}
173+
}
174+
return ans.String()
133175
}
134176
```
135177

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
string evaluate(string s, vector<vector<string>>& knowledge) {
4+
unordered_map<string, string> d;
5+
for (auto& e : knowledge) {
6+
d[e[0]] = e[1];
7+
}
8+
string ans;
9+
int i = 0, n = s.size();
10+
while (i < n) {
11+
if (s[i] == '(') {
12+
int j = s.find(")", i + 1);
13+
auto t = s.substr(i + 1, j - i - 1);
14+
ans += d.count(t) ? d[t] : "?";
15+
i = j;
16+
} else {
17+
ans += s[i];
18+
}
19+
++i;
20+
}
21+
return ans;
22+
}
23+
};
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func evaluate(s string, knowledge [][]string) string {
2+
d := map[string]string{}
3+
for _, v := range knowledge {
4+
d[v[0]] = v[1]
5+
}
6+
var ans strings.Builder
7+
i, n := 0, len(s)
8+
for ; i < n; i++ {
9+
if s[i] == '(' {
10+
j := i + 1
11+
for s[j] != ')' {
12+
j++
13+
}
14+
if v, ok := d[s[i+1:j]]; ok {
15+
ans.WriteString(v)
16+
} else {
17+
ans.WriteByte('?')
18+
}
19+
i = j
20+
} else {
21+
ans.WriteByte(s[i])
22+
}
23+
}
24+
return ans.String()
25+
}
Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,21 @@
11
class Solution {
22
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));
3+
Map<String, String> d = new HashMap<>(knowledge.size());
4+
for (var e : knowledge) {
5+
d.put(e.get(0), e.get(1));
66
}
7-
StringBuilder res = new StringBuilder();
7+
StringBuilder ans = new StringBuilder();
88
int i = 0, n = s.length();
99
while (i < n) {
1010
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;
11+
int j = s.indexOf(')', i + 1);
12+
ans.append(d.getOrDefault(s.substring(i + 1, j), "?"));
13+
i = j;
1514
} else {
16-
res.append(s.charAt(i));
17-
i += 1;
15+
ans.append(s.charAt(i));
1816
}
17+
++i;
1918
}
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;
19+
return ans.toString();
3020
}
3121
}

0 commit comments

Comments
 (0)