5714. 替换字符串中的括号内容
给你一个字符串
s
,它包含一些括号对,每个括号中包含一个 非空 的键。
- 比方说,字符串
"(name)is(age)yearsold"
中,有 两个 括号对,分别包含键"name"
和"age"
。你知道许多键对应的值,这些关系由二维字符串数组
knowledge
表示,其中knowledge[i] = [keyi, valuei]
,表示键keyi
对应的值为valuei
。你需要替换 所有 的括号对。当你替换一个括号对,且它包含的键为
keyi
时,你需要:
- 将
keyi
和括号用对应的值valuei
替换。- 如果从
knowledge
中无法得知某个键对应的值,你需要将keyi
和括号用问号"?"
替换(不需要引号)。
knowledge
中每个键最多只会出现一次。s
中不会有嵌套的括号。请你返回替换 所有 括号对后的结果字符串。
class Solution {
public String evaluate(String s, List<List<String>> knowledge) {
HashMap<String, String> map = new HashMap<>();
StringBuilder stringBuilder = new StringBuilder();
int index=0;
for (List<String> list : knowledge) {
map.put(list.get(0),list.get(1));
}
//index:从下标为index开始的字符串未被处理
//index1:"("的下标
//index2:")"的下标
//每次处理从index开始到第一个遇到的")"之间的字符串
//如果index没有遇到成对的(),则说明剩下字符串中已经不存在需要替换的部分,直接append之后返回
while(index<s.length()){
int index1,index2;
index1=s.indexOf("(",index);
index2=s.indexOf(")",index);
if(index2==-1||index2==-1){
stringBuilder.append(s.substring(index,s.length()));
break;
}
stringBuilder.append(s.substring(index,index1));
index=index2+1;
index1+=1;
String target = s.substring(index1,index2);
if(map.containsKey(target)){
stringBuilder.append(map.get(target));
}else{
stringBuilder.append("?");
}
}
return stringBuilder.toString();
}
}
坑
一开始用了replace,后来发现replace和replaceAll()都是替换匹配的所有子串,只不过入参不同,replaceAll()第一个形参是正则表达式(当然了也可以当普通字符串用)
replace(CharSequence target, CharSequence replacement)
replaceAll(String regex, String replacement)
后来用了replaceFirst()
replaceFirst(String regex, String replacement)
结果调试的时候才发现自己的算法跟下标有关系,替换了之后长度也变了,倒腾下标麻烦的一批,StringBuffer的append它不香吗?
技巧
- 根据下标做操作则不要在原数据上操作!!!