leetcode 65.Valid Number

验证数字是否是合法的,考虑使用编译原理中的DFA图来做的,分别赋予不同的状态以及在状态之间的转化过程的。

class Solution {
public:
    bool isNumber(string s) {
        int i=0;
        int n=s.size();
        while(i<n&&s[i]==' ') i++;
        while(n-1>=0&&s[n-1]==' ')n--;
        //cout<<i<<" "<<n<<endl;
        int state=1;
        for(;i<n;i++){
            if(state==1){
                if(s[i]=='-'||s[i]=='+') state=2;
                else if(s[i]=='.') state=4;
                else if(s[i]>='0'&&s[i]<='9') state=3;
                else return false;
            }
            else if(state==2){
                if(s[i]>='0'&&s[i]<='9') state=3;
                else if(s[i]=='.') state=4;
                else return false;
            }
            else if(state==3){
                if(s[i]>='0'&&s[i]<='9') state=3;
                else if(s[i]=='.') state=5;
                else if(s[i]=='e'||s[i]=='E') state=6; // 别漏了这个状态的
                else return false;
            }
            else if(state==4){
                if(s[i]>='0'&&s[i]<='9') state=5;
                else return false;
            }
            else if(state==5){
                if(s[i]>='0'&&s[i]<='9') state=5;
                else if(s[i]=='e'||s[i]=='E') state=6;
                else return false;
            }
            else if(state==6){
                if(s[i]>='0'&&s[i]<='9') state=8;
                else if(s[i]=='-'||s[i]=='+') state=7;
                else return false;
            }
            else if(state==7){
                if(s[i]>='0'&&s[i]<='9') state=8;
                else return false;
            }
            else if(state==8){
                if(s[i]>='0'&&s[i]<='9') state=8;
                else return false;
            }
            else return false;
        }
        return (state==3||state==5||state==8);
    }
};

 

posted on 2018-09-12 16:26  昔风不止,唯有努力生存  阅读(107)  评论(0编辑  收藏  举报

导航