LeetCode 722. 删除注释

题目描述

722. 删除注释

思路分析

解法一:状态机遍历(推荐)

核心思路

  • inBlock 标记是否在块注释中。
  • 遍历每一行字符,识别 ///* */
  • 非注释内容追加到当前行,行结束且不在块注释中则加入结果。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示所有字符数量。
  • 空间复杂度:O(n),用于保存输出内容。
class Solution {
    public List<String> removeComments(String[] source) {
        List<String> res = new ArrayList<>();
        boolean inBlock = false;
        StringBuilder sb = new StringBuilder();

        for (String line : source) {
            int i = 0;
            if (!inBlock) {
                sb.setLength(0);
            }

            while (i < line.length()) {
                if (!inBlock && i + 1 < line.length()
                        && line.charAt(i) == '/' && line.charAt(i + 1) == '*') {
                    // 进入块注释
                    inBlock = true;
                    i += 2;
                } else if (inBlock && i + 1 < line.length()
                        && line.charAt(i) == '*' && line.charAt(i + 1) == '/') {
                    // 结束块注释
                    inBlock = false;
                    i += 2;
                } else if (!inBlock && i + 1 < line.length()
                        && line.charAt(i) == '/' && line.charAt(i + 1) == '/') {
                    // 行注释,忽略剩余部分
                    break;
                } else {
                    if (!inBlock) {
                        sb.append(line.charAt(i));
                    }
                    i++;
                }
            }

            if (!inBlock && sb.length() > 0) {
                res.add(sb.toString());
            }
        }

        return res;
    }
}
func removeComments(source []string) []string {
    res := make([]string, 0)
    inBlock := false
    buf := make([]rune, 0)

    for _, line := range source {
        i := 0
        if !inBlock {
            buf = buf[:0]
        }

        for i < len(line) {
            if !inBlock && i+1 < len(line) && line[i] == '/' && line[i+1] == '*' {
                // 进入块注释
                inBlock = true
                i += 2
            } else if inBlock && i+1 < len(line) && line[i] == '*' && line[i+1] == '/' {
                // 结束块注释
                inBlock = false
                i += 2
            } else if !inBlock && i+1 < len(line) && line[i] == '/' && line[i+1] == '/' {
                // 行注释,忽略剩余部分
                break
            } else {
                if !inBlock {
                    buf = append(buf, rune(line[i]))
                }
                i++
            }
        }

        if !inBlock && len(buf) > 0 {
            res = append(res, string(buf))
        }
    }

    return res
}

相似题目

题目 难度 考察点
224. 基本计算器 困难 字符串解析
227. 基本计算器 II 中等 字符串解析
394. 字符串解码 中等 栈、字符串解析
856. 括号的分数 中等
1106. 解析布尔表达式 困难 栈、字符串解析
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/10450688
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!