有限状态自动机

表示数值的字符串

状态定义表

状态标号状态信息
0空格
1符号位
2整数
3dot前有数的dot
4dot前没有数的dot
5整数
6e
7符号位
8整数
9空格

初始状态:0、1、2、4

接受状态:2、3、5、8、9

转换条件表

表示缩写含义字符
blank' '空格' '
signs符号'+', '-'
dot.小数点'.'
digitd整数0-9
eee'e'
public boolean isNumber(String s) {
    HashMap[] states = {
            new HashMap<Character, Integer>() {{
                put(' ', 0);
                put('s', 1);
                put('d', 2);
                put('.', 4);
            }},   //0.
            new HashMap<Character, Integer>() {{
                put('d', 2);
                put('.', 4);
            }},   //1.
            new HashMap<Character, Integer>() {{
                put('d', 2);
                put('.', 3);
                put('e', 6);
                put(' ', 9);
            }},   //2.
            new HashMap<Character, Integer>() {{
                put('d', 5);
                put('e', 6);
                put(' ', 9);
            }},   //3.
            new HashMap<Character, Integer>() {{
                put('d', 5);
            }},   //4.
            new HashMap<Character, Integer>() {{
                put('d', 5);
                put('e', 6);
                put(' ', 9);
            }},   //5.
            new HashMap<Character, Integer>() {{
                put('d', 8);
                put('s', 7);
            }},   //6.
            new HashMap<Character, Integer>() {{
                put('d', 8);
            }},   //7.
            new HashMap<Character, Integer>() {{
                put('d', 8);
                put(' ', 9);
            }},   //8.
            new HashMap<Character, Integer>() {{
                put(' ', 9);
            }}    //9.
    };
    int state = 0; //初始状态
    char turn; //转变条件
    for (char c : s.toCharArray()) {
        if (c >= '0' && c <= '9') turn = 'd';
        else if (c == '+' || c == '-') turn = 's';
        else if (c == 'e' || c == 'E') turn = 'e';
        else if (c == '.' || c == ' ') turn = c;
        else turn = '?'; //不存在的转变条件,直接false
        if (!states[state].containsKey(turn)) return false;
        state = (int) states[state].get(turn);
    }
    //接受状态
    return state == 2 || state == 3 || state == 5 || state == 8 || state == 9;
}

参考https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/mian-shi-ti-20-biao-shi-shu-zhi-de-zi-fu-chuan-y-2/


hhhhh