我们定义三个状态:普通NORMAL、单行注释SINGLE以及多行注释MULTI;并定义行为:单行注释开始标志SINGLE_START、多行注释开始标志MULTI_START、单行注释结束标志SINGLE_END、多行注释结束标志MULTI_END、无行为NONE。 每次根据字符串信息,判断当前位置的行为,并根据当前状态进行转移。如果是正常状态则取值,否则丢弃。
注意由于注释占两个字符,需要进行两个字符的判断并根据之前状态和现在状态决定是否保留前一个字符。
Java代码实现
class Solution {
public enum State{
NORMAL, MULTI, SINGLE;
}
public enum Action{
MULTI_START, MULTI_END, SINGLE_START, SINGLE_END, NONE;
}
public State getNextState(State state, char pre, char cur){
// 判断动作
Action action;
if(pre == '/' && cur == '*') action = Action.MULTI_START;
else if(pre == '/' && cur == '/') action = Action.SINGLE_START;
else if(pre == '*' && cur == '/') action = Action.MULTI_END;
else if(cur == '\n') action = Action.SINGLE_END;
else action = Action.NONE;
// 进行状态转移
switch (state){
case NORMAL:
switch (action){
case SINGLE_START:
return State.SINGLE;
case MULTI_START:
return State.MULTI;
default:
return State.NORMAL;
}
case SINGLE:
switch (action){
case SINGLE_END:
return State.NORMAL;
default:
return State.SINGLE;
}
case MULTI:
switch (action){
case MULTI_END:
return State.NORMAL;
default:
return State.MULTI;
}
}
return State.NORMAL;
}
public String solve(String source){
char[] chars = source.toCharArray();
StringBuilder sb = new StringBuilder();
State pre = State.NORMAL;
State state = State.NORMAL;
sb.append(chars[0]);
for(int i=1;i<chars.length;i++){
pre = state;
state = getNextState(state, chars[i-1], chars[i]);
if(pre == State.NORMAL && state != State.NORMAL)
sb.deleteCharAt(sb.length()-1);
if(pre == State.NORMAL && state == State.NORMAL) sb.append(chars[i]);
}
return sb.toString();
}
public static void main(String[] args) {
String source="/* //aaa */ bbb \n // ccc \n";
System.out.println(new Solution().solve(source));
}
}