LeetCode 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. 解析布尔表达式 | 困难 | 栈、字符串解析 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!