- 魔法师2026-09-2613093
力扣 LeetCode

1807. 替换字符串中的括号内容 - 力扣(LeetCode)
1807. 替换字符串中的括号内容 - 给你一个字符串 s ,它包含一些括号对,每个括号中包含一个 非空 的键。
* 比方说,字符串 "(name)is(age)yearsold" 中,有 两个 括号对,分别包含键 "name" 和 "age" 。
你知道许多键对应的值,这些关系由二维字符串数组 knowledge 表示,其中 knowledge[i] = [keyi, valuei] ,表示键 keyi 对应的值为 valuei 。
你需要替换...
思路
先把KV存到Hash中,然后遍历字符串,遇到左括号找对应右括号取Key对应值。
做完昨天的题表示,不能嵌套的括号弱爆了!
代码```
class Solution {
public String evaluate(String s, List<List<String>> knowledge) {
HashMap<String, String> map = new HashMap<>();
for (List<String> list : knowledge) {
map.put(list.get(0), list.get(1));
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
int start = ++i;
while (i < s.length() && s.charAt(i) != ')') {
i++;
}
String name = s.substring(start, i);
sb.append(map.getOrDefault(name, "?"));
} else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}主楼 - SomeBottle2026-09-2611179
比较好处理的哈希表 + 字符串处理题。```
class Solution {
public:
string evaluate(string s, vector<vector<string>>& knowledge) {
// 哈希表题
unordered_map<string,string> kMap;
for(auto& k:knowledge){
kMap[k[0]]=k[1];
}
// 注意不会有嵌套的括号
string res;
int start=-1; // 上个左括号开始的位置
for(int i=0;i<s.size();i++){
if(start==-1){
// 当前不在括号内
if(s[i]=='('){
// 遇到左括号
start=i;
}else{
res.push_back(s[i]);
}
}else if(s[i]==')'){
// 在括号内,且遇到了右括号
string key=s.substr(start+1,i-start-1);
if(kMap.count(key)>0){
res+=kMap[key];
}else{
res.push_back('?');
}
start=-1;
}
}
return res;
}
}; - Lvvvv2026-09-2617266
这才是我该写的```
class Solution {
public:
string evaluate(string s, vector<vector<string>>& knowledge) {
unordered_map<string,string> S;
for(const auto& v : knowledge) {
S[v[0]] = v[1];
}
string res = "";
int n = s.size();
for(int i = 0; i < n; i++) {
if(s[i] != '(') {
res += s[i];
} else {
int j = i + 1;
string t = "";
while(s[j] != ')') {
t += s[j];
j++;
}
if(S.find(t) != S.end()) {
res += S[t];
} else {
res += '?';
}
i = j;
}
}
return res;
}
};