美文网首页
LeetCode-Valid Number

LeetCode-Valid Number

作者: 圣地亚哥_SVIP | 来源:发表于2018-10-27 15:53 被阅读0次

以下参考https://blog.csdn.net/kenden23/article/details/18696083?。
判断给定一个字符串是否是合法数字。

利用状态机实现:
几种状态表述如下:

0初始无输入或者只有space的状态
1输入了数字之后的状态
2前面无数字,只输入了Dot的状态
3输入了符号状态
4前面有数字和有dot的状态
5'e' or 'E'输入后的状态
6输入e之后输入Sign的状态
7输入e后输入数字的状态
8前面有有效数输入之后,输入space的状态

0 1 2 3 4 5 6 7 8代表几种状态,其状态转移矩阵如下:

//X:所处状态,Y表示输入的字符,transTable[X][Y]:表示在基于X状态,输入Y之后所处的状态
//Y:  输入非法字符 输入SPCE 输入符号 输入数字 输入DOT 输入E
int transTable[][6] = {
            -1,  0,  3,  1,  2, -1,//0初始无输入或者只有space的状态
            -1,  8, -1,  1,  4,  5,//1输入了数字之后的状态
            -1, -1, -1,  4, -1, -1,//2前面无数字,只输入了Dot的状态
            -1, -1, -1,  1,  2, -1,//3输入了符号状态
            -1,  8, -1,  4, -1,  5,//4前面有数字和有dot的状态
            -1, -1,  6,  7, -1, -1,//5'e' or 'E'输入后的状态
            -1, -1, -1,  7, -1, -1,//6输入e之后输入Sign的状态
            -1,  8, -1,  7, -1, -1,//7输入e后输入数字的状态
            -1,  8, -1, -1, -1, -1,//8前面有有效数输入之后,输入space的状态
        };

状态转移图如下:


State Transfer

按上述的状态转移图,其实现源码如下:

class Solution {
public:
    bool isNumber(string s) {
        
        enum class INPUT: int{
            INVALID=0,
            SPACE=1,
            SIGN=2,
            NUM=3,
            DOT=4,
            EXPONENT=5,
        };
        
        vector<vector<int>> transtable{{-1,  0,  3,  1,  2, -1},{-1,  8, -1,  1,  4,  5},{-1, -1, -1,  4, -1, -1},
                                        {-1, -1, -1,  1,  2, -1},{-1,  8, -1,  4, -1,  5},{-1, -1,  6,  7, -1, -1},
                                        {-1, -1, -1,  7, -1, -1},{-1,  8, -1,  7, -1, -1},{-1,  8, -1, -1, -1, -1}};
        int state = 0;
        for (int index=0;index<s.size();++index){
            INPUT input = INPUT::INVALID;
            if (s[index] == ' ')input = INPUT::SPACE;
            else if (s[index] == '-' || s[index] == '+')input = INPUT::SIGN;
            else if (isdigit(s[index]))input = INPUT::NUM;
            else if (s[index] == '.')input = INPUT::DOT;
            else if (s[index] == 'e' || s[index] == 'E')input = INPUT::EXPONENT;
            state = transtable[state][int(input)];
            if (state == -1)return false;
        }
        return state == 1 || state == 4 || state == 7 || state == 8;
    }
};

相关文章

网友评论

      本文标题:LeetCode-Valid Number

      本文链接:https://www.haomeiwen.com/subject/urofzftx.html