一、背景
每日一题:1807. 替换字符串中的括号内容
二、解答
1. 自解:
func evaluate(s string, knowledge [][]string) string {
// knowledge存map
knowMap := map[string]string{}
for _, kv := range knowledge {
knowMap[kv[0]] = kv[1]
}
// 遍历字符串s
index := 0
ans := ""
for index < len(s) {
// 如果等于(,开始遍历查找
if s[index] == '(' {
index++
word := ""
for index < len(s) {
if s[index] == ')' {
if knowMap[word] == "" {
ans += "?"
} else {
ans += knowMap[word]
}
break
}
word += string(s[index])
index++
}
}
// 如果等于(,开始遍历查找
if s[index] == ')' {
index++
continue
}
// 其他字符直接添加
if index < len(s) {
ans += string(s[index])
index++
} else {
break
}
}
return ans
}
2. 官方题解
func evaluate1(s string, knowledge [][]string) string {
// knowledge存map
knowMap := map[string]string{}
for _, kv := range knowledge {
knowMap[kv[0]] = kv[1]
}
// 遍历字符串s
ans := &strings.Builder{}
start := -1
for i, c := range s {
if c == '(' {
start = i
} else if c == ')' {
if t, ok := knowMap[s[start+1:i]]; ok {
ans.WriteString(t)
} else {
ans.WriteString("?")
}
start = -1
} else if start < 0 {
ans.WriteRune(c)
}
}
return ans.String()
}
三、总结
1. 自解与官解整体思路一直,具体实现不同。
- 我是采用索引加两重循环去处理,实际也是一次遍历
- 官方采用标识符来判断是括号内与括号外,再去处理。
2. 学习
- strings.Builder的使用
// 定义
ans := &strings.Builder{}
// 添加字符串
ans.WriteString(t)
// 添加字符串中的字符
ans.WriteRune(c)
// 转化为字符串
ans.String()
- 使用for range去处理效率较高,也不用担心越界
for i, c := range s {
}
- 处理map是否存在对应的值的时候,可以用ok去判断。我是使用题干条件+零值去判断的。
if t, ok := knowMap[s[start+1:i]]; ok {
ans.WriteString(t)
} else {
ans.WriteString("?")
}
- 截取字符串的时候直接使用切片
s[start+1:i]