class Solution { public enum CharType { NUMBER, OP, POINT, E;
public static CharType toCharType(Character c) { if (Character.isDigit(c)) { return NUMBER; } else if (c == '+' || c == '-') { return OP; } else if (c == '.') { return POINT; } else if (c =='e' || c == 'E') { return E; } else { return null; } } } public enum State { INIT(false), OP1(false), // 在.前面的数字 BEFORE_POINT_NUMBER(true), // 前面没数字的点 NO_BEFORE_NUMBER_POINT(false), // 前面有数字的点 BEFORE_NUMBER_POINT(true), // 点后面的数字 AFTER_POINT_NUMBER(true), // e/E OPE(false), // E后面的符号 OP2(false), // e后面的数字 AFTER_E_NUMBER(true);
// 是否可在这个状态结束 private boolean canEnd;
State(boolean canEnd) { this.canEnd = canEnd; }
public boolean isCanEnd() { return canEnd; } }
public Map<State, Map<CharType, State>> transferMap = new HashMap<>() {{ Map<CharType, State> map = new HashMap<>() {{ put(CharType.OP, State.OP1); put(CharType.NUMBER, State.BEFORE_POINT_NUMBER); put(CharType.POINT, State.NO_BEFORE_NUMBER_POINT); }}; put(State.INIT, map);
map = new HashMap<>() {{ put(CharType.POINT, State.NO_BEFORE_NUMBER_POINT); put(CharType.NUMBER, State.BEFORE_POINT_NUMBER); }}; put(State.OP1, map);
map = new HashMap<>() {{ put(CharType.POINT, State.BEFORE_NUMBER_POINT); put(CharType.NUMBER, State.BEFORE_POINT_NUMBER); put(CharType.E, State.OPE); }}; put(State.BEFORE_POINT_NUMBER, map);
map = new HashMap<>() {{ put(CharType.NUMBER, State.AFTER_POINT_NUMBER); }}; put(State.NO_BEFORE_NUMBER_POINT, map);
map = new HashMap<>() {{ put(CharType.NUMBER, State.AFTER_POINT_NUMBER); put(CharType.E, State.OPE); }}; put(State.BEFORE_NUMBER_POINT, map);
map = new HashMap<>() {{ put(CharType.E, State.OPE); put(CharType.NUMBER, State.AFTER_POINT_NUMBER); }}; put(State.AFTER_POINT_NUMBER, map); map = new HashMap<>() {{ put(CharType.OP, State.OP2); put(CharType.NUMBER, State.AFTER_E_NUMBER); }}; put(State.OPE, map); map = new HashMap<>() {{ put(CharType.NUMBER, State.AFTER_E_NUMBER); }}; put(State.OP2, map);
map = new HashMap<>() {{ put(CharType.NUMBER, State.AFTER_E_NUMBER); }}; put(State.AFTER_E_NUMBER, map); }}; public boolean isNumber(String s) { State state = State.INIT; for (char c : s.toCharArray()) { Map<CharType, State> transMap = transferMap.get(state); CharType charType = CharType.toCharType(c); if (charType == null) { return false; } if (!transMap.containsKey(charType)) { return false; } // 状态变更 state = transMap.get(charType); } return state.canEnd; }}
评论