跳至主要內容

1678. 设计 Goal 解析器


1678. 设计 Goal 解析器

🟢   🔖  字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

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.

题目大意

请你设计一个可以解释字符串 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)" 按某种顺序组成

解题思路

此题是一个简单的字符串解析问题,给定一个编码字符串 command,需要将其解析成目标字符串。规则如下:

  • "G" 转换为 "G"
  • "(al)" 转换为 "al"
  • "()" 转换为 "o"

思路一:遍历

  1. 遍历字符串:逐字符扫描 command
  2. 判断当前字符
    • 如果是 "G",直接追加到结果字符串 res
    • 如果是 "()"(当前字符为 '(',且下一个字符为 ')'),追加 "o",并跳过下一个字符。
    • 如果是 "(al)",直接追加 "al",并跳过后续 3 个字符。
  3. 输出结果:遍历结束后,返回构建的字符串。

复杂度分析

  • 时间复杂度O(n),其中 ncommand 的长度,单次遍历字符串。
  • 空间复杂度O(1),使用了常数个变量。

思路二:正则表达式

如果不想显式地遍历字符串,也可以用正则表达式进行替换:

复杂度分析

  • 时间复杂度O(n),其中 ncommand 的长度,正则替换需要遍历字符串。
  • 空间复杂度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;
};