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 <= 100command由 “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 是命令字符串的长度。两种方法的时间复杂度都是线性的,空间复杂度主要用于存储结果字符串。