Description#
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 the Goal 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.
Solutions#
Solution 1: String Replacement#
According to the problem, we only need to replace "()"
with 'o'
and "(al)"
with "al"
in the string command
.
1
2
3
| class Solution:
def interpret(self, command: str) -> str:
return command.replace('()', 'o').replace('(al)', 'al')
|
1
2
3
4
5
| class Solution {
public String interpret(String command) {
return command.replace("()", "o").replace("(al)", "al");
}
}
|
1
2
3
4
5
6
7
8
| class Solution {
public:
string interpret(string command) {
while (command.find("()") != -1) command.replace(command.find("()"), 2, "o");
while (command.find("(al)") != -1) command.replace(command.find("(al)"), 4, "al");
return command;
}
};
|
1
2
3
4
5
| func interpret(command string) string {
command = strings.ReplaceAll(command, "()", "o")
command = strings.ReplaceAll(command, "(al)", "al")
return command
}
|
1
2
3
| function interpret(command: string): string {
return command.replace(/\(\)/g, 'o').replace(/\(al\)/g, 'al');
}
|
1
2
3
4
5
| impl Solution {
pub fn interpret(command: String) -> String {
command.replace("()", "o").replace("(al)", "al")
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| char* interpret(char* command) {
int n = strlen(command);
char* ans = malloc(sizeof(char) * n + 1);
int i = 0;
for (int j = 0; j < n; j++) {
char c = command[j];
if (c == 'G') {
ans[i++] = 'G';
} else if (c == '(') {
if (command[j + 1] == ')') {
ans[i++] = 'o';
} else {
ans[i++] = 'a';
ans[i++] = 'l';
}
}
}
ans[i] = '\0';
return ans;
}
|
Solution 2: String Iteration#
We can also iterate over the string command
. For each character $c$:
- If it is
'G'
, directly add $c$ to the result string; - If it is
'('
, check if the next character is ')'
. If it is, add 'o'
to the result string. Otherwise, add "al"
to the result string.
After the iteration, return the result string.
The time complexity is $O(n)$, and the space complexity is $O(1)$.
1
2
3
4
5
6
7
8
9
| class Solution:
def interpret(self, command: str) -> str:
ans = []
for i, c in enumerate(command):
if c == 'G':
ans.append(c)
elif c == '(':
ans.append('o' if command[i + 1] == ')' else 'al')
return ''.join(ans)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Solution {
public String interpret(String command) {
StringBuilder ans = new StringBuilder();
for (int i = 0; i < command.length(); ++i) {
char c = command.charAt(i);
if (c == 'G') {
ans.append(c);
} else if (c == '(') {
ans.append(command.charAt(i + 1) == ')' ? "o" : "al");
}
}
return ans.toString();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Solution {
public:
string interpret(string command) {
string ans;
for (int i = 0; i < command.size(); ++i) {
char c = command[i];
if (c == 'G')
ans += c;
else if (c == '(')
ans += command[i + 1] == ')' ? "o" : "al";
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| func interpret(command string) string {
ans := &strings.Builder{}
for i, c := range command {
if c == 'G' {
ans.WriteRune(c)
} else if c == '(' {
if command[i+1] == ')' {
ans.WriteByte('o')
} else {
ans.WriteString("al")
}
}
}
return ans.String()
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| function interpret(command: string): string {
const n = command.length;
const ans: string[] = [];
for (let i = 0; i < n; i++) {
const c = command[i];
if (c === 'G') {
ans.push(c);
} else if (c === '(') {
ans.push(command[i + 1] === ')' ? 'o' : 'al');
}
}
return ans.join('');
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| impl Solution {
pub fn interpret(command: String) -> String {
let mut ans = String::new();
let bs = command.as_bytes();
for i in 0..bs.len() {
if bs[i] == b'G' {
ans.push_str("G");
}
if bs[i] == b'(' {
ans.push_str({
if bs[i + 1] == b')' { "o" } else { "al" }
});
}
}
ans
}
}
|