this problem needs to be dealed character by character each line, as there’re multi-cases.
I just copy one solution here.
PS: new followers increase.
Steps:
Iterate each line from the input document.
Inside the line, iterate each character of this line, check below conditions one by one
if in scope & meet “/”: you are not in scope from now
if in scope & meet “//”: add the string to list
if in scope: add character to the string, then if it is the end of the line, add the string to list
if NOT in scope & meet “/”: you are in scope again, then if it is last 2 characters of line, add the string to list
Summary:
If in scope, you have to beware if signs of “/” or “//” first.
Otherwise, you can collect the characters.
If not in scope, you have to beware if signs of “/” to get you back to scope
import java.util.ArrayList;
import java.util.List;
class Solution {
private void addStToList(List<String> rl , StringBuilder sb){
if(sb.length()>0){
rl.add(sb.toString());
sb.setLength(0);
}
}
public List<String> removeComments(String[] source) {
List<String> rl = new ArrayList<>();
boolean inScope = true;
StringBuilder sb = new StringBuilder();
for (String line : source) {
char[] ar = line.toCharArray();
int m = ar.length;
int i = 0;
while (i < m) {
// System.out.println("char="+ar[i]);
if(inScope&&(i +1<m)&&("/*".equals(line.substring(i, i + 2)))){
inScope=false;
i+=2;
}else if(inScope&&(i +1<m)&&("//".equals(line.substring(i, i + 2)))){
addStToList(rl, sb);
break;
}else if(inScope){
sb.append(ar[i]);
if(i==m-1) addStToList(rl, sb);
i++;
}else if(!inScope&& (i +1<m) && ("*/".equals(line.substring(i, i + 2))) ){
inScope=true;
if(i==m-2) addStToList(rl, sb);
i+=2;
}else{
i++;
}
}
}
return rl;
}
}