Valid Number(使用DFA,有图)

来源:互联网 发布:sister组合shake it 编辑:程序博客网 时间:2024/05/24 05:20

Validate if a given string is numeric.It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

解题分析
好久好久没有用DFA了,才发现很多学过的东西真的很有用。这道题就可以用DFA来解决。先上图,然后对图进行一下分析。
这里写图片描述

q1是初始状态;
q2是个过渡状态,代表符号;
q3是个终止状态,表示不包含的小数点‘.’,只包含符号和纯数字的数;
q4是个过渡状态,代表包含符号和小数点的状态;
q5是个终止状态,代表不包含科学计数法的数;
q6是个过渡状态,代表接受e的状态;
q7是个过渡状态,代表接受e后,科学计数法包含符号的状态;
q8是个终止状态,代表包含所有合法符号的状态。

Accept代码

class Solution {public:    bool isNumber(string s) {        int state=1;        for(auto c:s){            switch (state){                case 1:                    if(c==' ')              state=1;                    else if(c=='+'||c=='-') state=2;                    else if(isdigit(c))     state=3;                    else if(c=='.')         state=4;                    else                    return false;                    break;                case 2:                    if(isdigit(c))          state=3;                    else if(c=='.')         state=4;                    else                    return false;                    break;                case 3:                    if(isdigit(c))          state=3;                    else if(c=='e'||c=='E') state=6;                    else if(c=='.')         state=5;                    else if(c==' ')         state=9;                    else                    return false;                    break;                case 4:                    if(isdigit(c))          state=5;                    else                    return false;                    break;                case 5:                    if(isdigit(c))          state=5;                    else if(c=='e'||c=='E') state=6;                    else if(c==' ')         state=9;                    else                    return false;                    break;                case 6:                    if(c=='+'||c=='-')      state=7;                    else if(isdigit(c))     state=8;                    else                    return false;                    break;                case 7:                    if(isdigit(c))          state=8;                    else                    return false;                    break;                case 8:                    if(isdigit(c))          state=8;                    else if(c==' ')         state=9;                    else                    return false;                    break;                case 9:                    if(c==' ')              state=9;                    else                    return false;                    break;                }        }        return state==3||state==5||state==8||state==9;    }};
0 0
原创粉丝点击