【2022-11-06每日一题】1678. 设计 Goal 解析器[Easy]

2022-11-06
2分钟阅读时长

2022-11-06每日一题:1678. 设计 Goal 解析器

难度:Easy

标签:字符串

请你设计一个可以解释字符串 commandGoal 解析器command"G""()" 和/或 "(al)" 按某种顺序组成。Goal 解析器会将 "G" 解释为字符串 "G""()" 解释为字符串 "o""(al)" 解释为字符串 "al" 。然后,按原顺序将经解释得到的字符串连接成一个字符串。

给你字符串 command ,返回 Goal 解析器 command 的解释结果。

 

示例 1:

输入:command = "G()(al)"
输出:"Goal"
解释:Goal 解析器解释命令的步骤如下所示:
G -> G
() -> o
(al) -> al
最后连接得到的结果是 "Goal"

示例 2:

输入:command = "G()()()()(al)"
输出:"Gooooal"

示例 3:

输入:command = "(al)G(al)()()G"
输出:"alGalooG"

 

提示:

  • 1 <= command.length <= 100
  • command"G""()" 和/或 "(al)" 按某种顺序组成
### 方法一: 暴力替换
func interpret(command string) string {
    return strings.ReplaceAll(strings.ReplaceAll(command, "()", "o"), "(al)", "al")
}

方法二:一次遍历

  • “G” 转换为 “G”;
  • “()” 转换为 “o”;
  • “(al)” 转换为 “al”;

写法一

func interpret(command string) string {
    ans := []byte{}
    for i, c := range command {
        if c == 'G' {
            ans = append(ans, 'G')   
        } else if c == ')' && command[i-1] == 'l'{
            ans = append(ans, 'a', 'l')
        } else if c == ')' && command[i-1] == '(' {
            ans = append(ans, 'o')
        }
    }
    return string(ans)
}

写法二

func interpret(command string) string {
    res := &strings.Builder{}
    for i, c := range command {
        if c == 'G' {
            res.WriteByte('G') 
        } else if c == '(' {
            if command[i+1] == ')' {
                res.WriteByte('o') 
            } else {
                res.WriteString("al") 
            }
        }
    }
    return res.String()
}

复杂度分析

  • 时间复杂度:O(n),其中 n 表示字符串的长度。我们只需遍历一遍字符串即可。
  • 空间复杂度:O(1)。除返回值以外不需要额外的空间。

LeetCode题库地址