面试题20. 表示数值的字符串

253 阅读1分钟
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100""5e2""-123""3.1416""0123"都表示数值,
但"12e""1a3.14""1.2.3""+-5""-1E-16""12e+5.4"都不是。

之前都不知道有限状态自动机=。=

看着大佬的思路,自己尝试了一下

尽管状态划分得有点多,没有大佬的简洁,但是毕竟是根据自己理解写的,记录一下

class Solution {
    public boolean isNumber(String s) {
        Map[] states = new Map[10];
        states[0] = new HashMap(){{put('d',1);put('f',2);put(' ',0);put('.',8);}};
        states[1] = new HashMap(){{put('d',1);put('.',3);put('e',4);put(' ',6);}};
        states[2] = new HashMap(){{put('.',8);put('d',1);}};
        states[3] = new HashMap(){{put('e',4);put('d',5);put(' ',6);}};
        states[4] = new HashMap(){{put('f',7);put('d',9);}};
        states[5] = new HashMap(){{put('d',5);put(' ',6);put('e',4);}};
        states[6] = new HashMap(){{put(' ',6);}};
        states[7] = new HashMap(){{put('d',9);}};
        states[8] = new HashMap(){{put('d',5);}};
        states[9] = new HashMap(){{put('d',9);put(' ',6);}};

        int start = 0;
        char cmp;
        for(char c : s.toCharArray()){
            if(c=='+'||c=='-')cmp='f';
            else if(c>='0'&&c<='9')cmp='d';
            else cmp=c;
            if(!states[start].containsKey(cmp)) return false;
            start = (int)states[start].get(cmp);
        }
        return start==1||start==3||start==5||start==6||start==9;
    }
}

标红的块表示以该状态结束的情况判定为真。