刷题的日常-设计 Goal 解析器

61 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

刷题的日常-2022年11月22号

一天一题,保持脑子清爽

设计 Goal 解析器

来自leetcode的 1678 题,题意如下:

请你设计一个可以解释字符串 command 的 Goal 解析器 。command 由 "G"、"()" 和/或 "(al)" 按某种顺序组成。Goal 解析器会将 "G" 解释为字符串 "G"、"()" 解释为字符串 "o" ,"(al)" 解释为字符串 "al" 。然后,按原顺序将经解释得到的字符串连接成一个字符串。

给你字符串 command ,返回 Goal 解析器 对 command 的解释结果。

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个字符串,字符串是由"G"、"()" 和/或 "(al)" 组成的
  • 给出一系列的规则
    • "G" 变为 "G"
    • "()" 变为 "o"
    • "(al)" 变为 "al"
  • 要求我们对原字符串按照规则替换之后 形成的 新字符串

做题思路

简单题,直接暴力模拟就可以得出答案,我们每次对读取的字符进行判断,如果有符合替换条件的字样出现,就用题意给出的条件进行替换,然后将其放回字符串中,步骤如下:

  • 开辟一个缓存区保存字符串信息
  • 循环读取字符,每次对字符的处理步骤如下
    • 如果当前字符为 'G',则直接将当前字符加进缓冲区即可
    • 如果当前字符不是'G',并且下一个字符是')',则将 'o' 放进缓冲区
    • 否则将 "al" 放进缓冲区
  • 在循环处理的过程当中要注意所以的变更,由于题目保证了给定的字符串是可以满足替换规则的,所以不需要进行校验。

代码实现

代码实现如下:

public class Solution {
    public String interpret(String command) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < command.length(); i++) {
            char c = command.charAt(i);
            if (c == 'G') {
                sb.append(c);
                continue;
            }
            c = command.charAt(++i);
            if (c == ')') {
                sb.append('o');
                continue;
            }
            i += 2;
            sb.append("al");
        }
        return sb.toString();
    }
}

image.png