题目 leetcode.cn/
- 给你一个字符串
s,它包含一些括号对,每个括号中包含一个 非空 的键。- 比方说,字符串
"(name)is(age)yearsold"中,有 两个 括号对,分别包含键"name"和"age"。
- 比方说,字符串
- 你知道许多键对应的值,这些关系由二维字符串数组
knowledge表示,其中knowledge[i] = [keyi, valuei],表示键keyi对应的值为valuei。 - 你需要替换 所有 的括号对。当你替换一个括号对,且它包含的键为
keyi时,你需要:- 将
keyi和括号用对应的值valuei替换。 - 如果从
knowledge中无法得知某个键对应的值,你需要将keyi和括号用问号"?"替换(不需要引号)。
- 将
knowledge中每个键最多只会出现一次。s中不会有嵌套的括号。- 请你返回替换 所有 括号对后的结果字符串。
示例
-
示例 1:
- 输入: s = "(name)is(age)yearsold", knowledge = [["name","bob"],["age","two"]]
- 输出: "bobistwoyearsold"
- 解释:键 "name" 对应的值为 "bob" ,所以将 "(name)" 替换为 "bob" 。键 "age" 对应的值为 "two" ,所以将 "(age)" 替换为 "two" 。
-
示例 2:
- 输入: s = "hi(name)", knowledge = [["a","b"]]
- 输出: "hi?"
- 解释: 由于不知道键 "name" 对应的值,所以用 "?" 替换 "(name)" 。
-
示例 3:
- 输入: s = "(a)(a)(a)aaa", knowledge = [["a","yes"]]
- 输出: "yesyesyesaaa"
- 解释: 相同的键在 s 中可能会出现多次。键 "a" 对应的值为 "yes" ,所以将所有的 "(a)" 替换为 "yes" 。注意,不在括号里的 "a" 不需要被替换。
提示:
1 <= s.length <= 10000000 <= knowledge.length <= 1000000knowledge[i].length == 21 <= keyi.length, valuei.length <= 10s只包含小写英文字母和圆括号'('和')'。s中每一个左圆括号'('都有对应的右圆括号')'。s中每对括号内的键都不会为空。s中不会有嵌套括号对。keyi和valuei只包含小写英文字母。knowledge中的keyi不会重复。
代码
function evaluate(s: string, knowledge: string[][]): string {
while(s.includes('(')){
let leftIndex = s.indexOf('(');
let rigthIndex = s.indexOf(')');
let iconKey = s.substring(leftIndex, rigthIndex + 1);
let key = iconKey.substring(1, iconKey.length - 1);
if(!knowledge.length) {
s = s.replace(iconKey, '?');
}
for(let i = 0; i < knowledge.length; i++){
if(key === knowledge[i][0]){
s = s.replace(iconKey, knowledge[i][1]);
break;
}
if(i === knowledge.length - 1 && key !== knowledge[i][0]){
s = s.replace(iconKey, '?');
}
}
}
return s
};
- 逐个暴力替换:
- 字符串中的每个括号都是成对出现的且不嵌套,那么第一个符号一定是
"(",第二个一定是")" - 当整个字符串包含
"("符号的时候,可以使用indexOf分别找到第一个"("和第一个")"的下标 - 然后使用字符串
substring方法将包含"()"符号和key都取出来,格式为(key) - 将上面取出来包含符号的
key去除掉符号,得到单独的key值,方便下面与knowledge中的key值比较 - 然后遍历整个
knowledge数组,将key值逐一比较,如果其中有相等的key,那么与之对应的value值将替换掉上方带符号的key值(即"(key)"格式)。replace方法不会改变原字符串,会返回一个新字符串,所以得重新赋值- 如果找到相等的
key且替换之后,退出当前遍历,马上进行下一次的符号匹配 - 如果在数组中找不到与之相等的
key,那么按照题目要求,使用"?"替换原来的key值(即:"(key)")
- 值得注意的是
knowledge数组可能为空,那么久没有遍历的必要。可以在遍历之前判断是否为空,如果是,则直接用"?"替换即可
- 字符串中的每个括号都是成对出现的且不嵌套,那么第一个符号一定是
结果
- 逐一查找替换,用时间换空间,耗时确实有点长,不过也是思路之一