yankewei / LeetCode

LeetCode 问题的解决方法
MIT License
6 stars 0 forks source link

替换字符串中的括号内容 #128

Open yankewei opened 3 years ago

yankewei commented 3 years ago

给你一个字符串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" 不需要被替换。

示例 4:

输入:s = "(a)(b)", knowledge = [["a","b"],["b","a"]]
输出:"ba"

提示:

yankewei commented 3 years ago

正则

func evaluate(s string, knowledge [][]string) string {
    dict := make(map[string]string, len(knowledge))
    for _, v := range knowledge {
    dict[v[0]] = v[1]
    }
    re := regexp.MustCompile(`\([a-z]+\)`)

    return re.ReplaceAllStringFunc(s, func (substr string) string {
    substr = strings.Trim(substr, "(")
    substr = strings.Trim(substr, ")")
    if v, e := dict[substr]; e {
        return v
    } else {
        return "?"
    }
    })
}
yankewei commented 3 years ago

func evaluate(s string, knowledge [][]string) string {
    var ret strings.Builder
    dict := make(map[string]string, len(knowledge))
    for _, v := range knowledge {
    dict[v[0]] = v[1]
    }
    stack := []byte{}
    for i := 0; i < len(s); i++ {
    if s[i] == '(' {
        stack = append(stack, s[i])
    } else if s[i] == ')' {
        str := string(stack[1:])
        if v, e := dict[str]; e {
        ret.WriteString(v)
        } else {
        ret.WriteString("?")
        }
        stack = []byte{}
    } else if s[i] != '(' && len(stack) > 0{
        stack = append(stack, s[i])
    } else {
        ret.WriteByte(s[i])
        }
    }
    return ret.String()
}