题目地址:
https://leetcode.com/problems/remove-comments/
给定一个C++代码,要求将所有的注释删除。有两种注释,一种是单行注释,该注释以"//"
开头,并且会注释掉所有"//"
之后的字符;另一种是多行注释,该注释以"/*"
开头,一直到下一个最近的"*/"
为止,题目保证对于任何一个"/*"
都会有对应的"*/"
与之配对。要求将所有注释删除后返回C++代码。题目保证输入里不会存在引号和转义符,只要遇到"/*"
就可以认为是注释开始。如果某行全是注释,则产生了空行,返回不许包含空行。
为了方便可以将整个代码连成一整个字符串
s
s
s,每行之间用"\n"
分隔开。接着开始遍历
s
s
s,如果遇到"//"
,那么说明遇到了单行注释,则略过所有之后的字符直到遇到"\n"
为止;如果遇到了"/*"
,那么说明遇到了多行注释,则略过所有之后的字符直到遇到"/*"
为止;遇到了"\n"
说明处理好了一行,则看一下这行是否不空,如果不空就加入答案;遇到正常字符直接append。代码如下:
class Solution {
public:
vector<string> removeComments(vector<string>& v) {
vector<string> res;
string s;
for (auto& str : v) s += str + '\n';
string p;
for (int i = 0; i < s.size();) {
if (i + 1 < s.size() && s.substr(i, 2) == "//") {
while (s[i] != '\n') i++;
} else if (i + 1 < s.size() && s.substr(i, 2) == "/*") {
i += 2;
while (s.substr(i, 2) != "*/") i++;
i += 2;
} else if (s[i] == '\n') {
if (p.size()) {
res.push_back(p);
p = "";
}
i++;
} else
p += s[i++];
}
return res;
}
};
时间复杂度 O ( n l ) O(nl) O(nl),空间 O ( l ) O(l) O(l), n n n是代码行数, l l l是每行的最长代码长度。