Easy

题目描述

你拥有一个Goal解析器,它可以解释字符串命令。命令由字母"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)” 按某种顺序组成

提示:

  • 你最多需要检查2个字符就能确定下一个字符是什么。

解题思路

这道题的核心思路是字符串解析和替换。我们需要遍历命令字符串,根据不同的模式进行相应的转换。

方法一:字符串替换 最简单直接的方法是使用字符串的内置替换功能,按顺序替换所有的"(al)“为"al”,"()“为"o”,保持"G"不变。这种方法代码简洁,易于理解。

方法二:逐字符遍历 遍历字符串,当遇到’G’时直接添加’G’;当遇到’(‘时,检查后续字符判断是"()“还是”(al)",然后添加相应的结果并跳过相应的字符数。这种方法更加灵活,适合处理更复杂的解析逻辑。

方法三:双指针/索引遍历 使用索引变量控制遍历过程,根据当前字符和下一个字符的组合来决定解析结果,这种方法在处理需要预读的情况下比较有效。

对于这道题,由于模式固定且简单,字符串替换方法最为简洁高效,是推荐的解法。而逐字符遍历方法虽然代码稍长,但逻辑清晰,也是很好的选择。

代码实现

class Solution {
public:
    string interpret(string command) {
        string result = "";
        int i = 0;
        while (i < command.length()) {
            if (command[i] == 'G') {
                result += 'G';
                i++;
            } else if (command[i] == '(' && command[i+1] == ')') {
                result += 'o';
                i += 2;
            } else { // command[i] == '(' && command[i+1] == 'a'
                result += "al";
                i += 4;
            }
        }
        return result;
    }
};
class Solution:
    def interpret(self, command: str) -> str:
        return command.replace("(al)", "al").replace("()", "o")
public class Solution {
    public string Interpret(string command) {
        return command.Replace("(al)", "al").Replace("()", "o");
    }
}
var interpret = function(command) {
    return command.replace(/\(al\)/g, "al").replace(/\(\)/g, "o");
};

复杂度分析

解法时间复杂度空间复杂度
字符串替换O(n)O(n)
逐字符遍历O(n)O(n)

其中 n 是命令字符串的长度。两种方法的时间复杂度都是线性的,空间复杂度主要用于存储结果字符串。