Valid Number 有限状态自动机

思路:

方法:有限状态自动机。时间复杂度O(N),空间复杂度O(N)。

编译原理做过如何判别数字。本题更简单一点,因为测试用例如下是给 true 的:

01      true
.1      true
.0      true
0.      true
-1.     true
-01     true
-.1     true
-.1e1   true
-.1e-01 true
-1.e-1  true

首先,画出有限自动机状态转移图;
这里写图片描述
然后,根据图,填表;
最后,根据表,编码实现。

class Solution {
public:
    bool isNumber(string s) {
        enum InputType {
            INVALID,    //  1. invalid input
            SIGN,       //  2. '+' or '-'
            DIGIT,      //  3. digits
            DOT,        //  4. '.'
            EXP         //  5. 'e'
        };
        const int NUM_INPUT = 5;
        if(s == " ") return false;
        //get rid of space
        int start = s.find_first_not_of(" ");
        int end = s.find_last_not_of(" ");
        string ss = s.substr(start, end-start+1);
        int n = ss.size();

        int state = 0;
        const int transitionTable[][NUM_INPUT] = {
            -1,  3, 1,  2, -1,
            -1, -1, 1,  4,  5,
            -1, -1, 4, -1, -1,
            -1, -1, 1,  2, -1,
            -1, -1, 4, -1,  5,
            -1,  6, 7, -1, -1,
            -1, -1, 7, -1, -1,
            -1, -1, 7, -1, -1,
            -1, -1, 7, -1, -1,
        };

        for(int i = 0; i < n; ++i) {
            InputType type = INVALID;
            if(ss[i] == '+' || ss[i] == '-') {
                type = SIGN;
            }else if(isdigit(ss[i])) {
                type = DIGIT;
            }else if(ss[i] == '.') {
                type = DOT;
            }else if(ss[i] == 'e' || ss[i] == 'E') {
                type = EXP;
            }
            state = transitionTable[state][type];

            if(state == -1) return false;
        }
        return state == 1 || state == 4 || state == 7;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值