1678. 设计 Goal 解析器
1678. 设计 Goal 解析器
题目
You own a Goal Parser that can interpret a string command
. The command
consists of an alphabet of "G"
, "()"
and/or "(al)"
in some order. The Goal Parser will interpret "G"
as the string "G"
, "()"
as the string "o"
, and "(al)"
as the string "al"
. The interpreted strings are then concatenated in the original order.
Given the string command
, return _theGoal Parser 's interpretation of _command
.
Example 1:
Input: command = "G()(al)"
Output: "Goal"
Explanation: The Goal Parser interprets the command as follows:
G -> G
() -> o
(al) -> al
The final concatenated result is "Goal".
Example 2:
Input: command = "G()()()()(al)"
Output: "Gooooal"
Example 3:
Input: command = "(al)G(al)()()G"
Output: "alGalooG"
Constraints:
1 <= command.length <= 100
command
consists of"G"
,"()"
, and/or"(al)"
in some order.
题目大意
请你设计一个可以解释字符串 command
的 Goal 解析器 。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)"
按某种顺序组成
解题思路
此题是一个简单的字符串解析问题,给定一个编码字符串 command
,需要将其解析成目标字符串。规则如下:
"G"
转换为"G"
。"(al)"
转换为"al"
。"()"
转换为"o"
。
思路一:遍历
- 遍历字符串:逐字符扫描
command
。 - 判断当前字符:
- 如果是
"G"
,直接追加到结果字符串res
。 - 如果是
"()"
(当前字符为'('
,且下一个字符为')'
),追加"o"
,并跳过下一个字符。 - 如果是
"(al)"
,直接追加"al"
,并跳过后续 3 个字符。
- 如果是
- 输出结果:遍历结束后,返回构建的字符串。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是command
的长度,单次遍历字符串。 - 空间复杂度:
O(1)
,使用了常数个变量。
思路二:正则表达式
如果不想显式地遍历字符串,也可以用正则表达式进行替换:
复杂度分析
- 时间复杂度:
O(n)
,其中n
是command
的长度,正则替换需要遍历字符串。 - 空间复杂度:
O(1)
,使用了常数个变量。
代码
/**
* @param {string} command
* @return {string}
*/
var interpret = function (command) {
let res = '';
for (let i = 0; i < command.length; i++) {
if (command[i] == 'G') {
res += command[i];
} else if (command[i] == '(' && command[i + 1] == ')') {
res += 'o';
i++;
} else {
res += 'al';
i += 3;
}
}
return res;
};
/**
* @param {string} command
* @return {string}
*/
var interpret = function (command) {
return command.replace(/\(\)/g, 'o').replace(/\(al\)/g, 'al');
};