LeetCode-Valid Number-合法数字-状态机

https://oj.leetcode.com/problems/valid-number/

判断一个字符串是否为合法字符。

这个题目画出状态机,可以做一个二维的状态表,然后回溯。注意这个状态表中其实没有分支,所以其实不需要真的回溯在往下搜索。

int trans[10][6]={
    { 0, 1, 2, 9,-1,-1},
    {-1,-1, 2, 9,-1,-1},
    { 8,-1, 2, 3, 5,-1},
    { 8,-1, 4,-1, 5,-1},    //.
    { 8,-1, 4,-1, 5,-1},                    //\d+
    {-1, 6, 7,-1,-1,-1},//e
    {-1,-1, 7,-1,-1,-1},//-
    { 8,-1, 7,-1,-1,-1},//\d+
    { 8,-1,-1,-1,-1,-1},//$
    {-1,-1, 4,-1,-1,-1}    //.
};
class Solution {
public:
    int m,n;
    string s;
    int GetItem(char a){
        if (a==' '){return 0;}
        if (a=='-' || a=='+'){return 1;}
        if (a>='0' && a<='9'){return 2;}
        if (a=='.'){return 3;}
        if (a=='e'){return 4;}
        return 5;
    }
    bool Solve(int p,int stat){
        if (p==n){
            if (stat==2 || stat==3 || stat==4|| stat==7|| stat==8){return true;}
            return false;
        }
        int curT=GetItem(s[p]);
        int ns=trans[stat][curT];
        if (ns==-1){return false;}
        return Solve(p+1,ns);
    }

    bool isNumber(const char *s) {
        this->s=string(s);
        n=this->s.length();
        return Solve(0,0);
    }
};

 

posted @ 2014-09-30 16:07  zombies  阅读(206)  评论(0编辑  收藏  举报