|
| 1 | +722. Remove Comments |
| 2 | + |
| 3 | +Medium |
| 4 | + |
| 5 | +Given a C++ program, remove comments from it. The program source is an array of strings `source` where `source[i]` is the <code>i<sup>th</sup></code> line of the source code. This represents the result of splitting the original source code string by the newline character `' |
| 6 | +'`. |
| 7 | + |
| 8 | +In C++, there are two types of comments, line comments, and block comments. |
| 9 | + |
| 10 | +* The string `"//"` denotes a line comment, which represents that it and the rest of the characters to the right of it in the same line should be ignored. |
| 11 | +* The string `"/*"` denotes a block comment, which represents that all characters until the next (non-overlapping) occurrence of `"*/"` should be ignored. (Here, occurrences happen in reading order: line by line from left to right.) To be clear, the string `"/*/"` does not yet end the block comment, as the ending would be overlapping the beginning. |
| 12 | + |
| 13 | +The first effective comment takes precedence over others. |
| 14 | + |
| 15 | +* For example, if the string `"//"` occurs in a block comment, it is ignored. |
| 16 | +* Similarly, if the string `"/*"` occurs in a line or block comment, it is also ignored. |
| 17 | + |
| 18 | +If a certain line of code is empty after removing comments, you must not output that line: each string in the answer list will be non-empty. |
| 19 | + |
| 20 | +There will be no control characters, single quote, or double quote characters. |
| 21 | + |
| 22 | +* For example, `source = "string s = "/* Not a comment. */";"` will not be a test case. |
| 23 | + |
| 24 | +Also, nothing else such as defines or macros will interfere with the comments. |
| 25 | + |
| 26 | +It is guaranteed that every open block comment will eventually be closed, so `"/*"` outside of a line or block comment always starts a new comment. |
| 27 | + |
| 28 | +Finally, implicit newline characters can be deleted by block comments. Please see the examples below for details. |
| 29 | + |
| 30 | +After removing the comments from the source code, return _the source code in the same format_. |
| 31 | + |
| 32 | +**Example 1:** |
| 33 | + |
| 34 | +**Input:** source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"] |
| 35 | + |
| 36 | +**Output:** ["int main()","{ "," ","int a, b, c;","a = b + c;","}"] |
| 37 | + |
| 38 | +**Explanation:** The line by line code is visualized as below: |
| 39 | + |
| 40 | + /*Test program */ |
| 41 | + int main() { |
| 42 | + // variable declaration |
| 43 | + int a, b, c; |
| 44 | + /* This is a test |
| 45 | + multiline comment |
| 46 | + for testing */ |
| 47 | + a = b + c; |
| 48 | + } |
| 49 | + The string /* denotes a block comment, including line 1 and lines 6-9. The string // denotes line 4 as comments. |
| 50 | + The line by line output code is visualized as below: |
| 51 | + int main() { |
| 52 | + int a, b, c; |
| 53 | + a = b + c; |
| 54 | + } |
| 55 | + |
| 56 | +**Example 2:** |
| 57 | + |
| 58 | +**Input:** source = ["a/*comment", "line", "more_comment*/b"] |
| 59 | + |
| 60 | +**Output:** ["ab"] |
| 61 | + |
| 62 | +**Explanation:** The original source string is "a/*comment |
| 63 | +line |
| 64 | +more_comment*/b", where we have bolded the newline characters. After deletion, the implicit newline characters are deleted, leaving the string "ab", which when delimited by newline characters becomes ["ab"]. |
| 65 | + |
| 66 | +**Constraints:** |
| 67 | + |
| 68 | +* `1 <= source.length <= 100` |
| 69 | +* `0 <= source[i].length <= 80` |
| 70 | +* `source[i]` consists of printable **ASCII** characters. |
| 71 | +* Every open block comment is eventually closed. |
| 72 | +* There are no single-quote or double-quote in the input. |
0 commit comments