国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > Leetcode 65 Valid Number DFA有限状态机

Leetcode 65 Valid Number DFA有限状态机

来源:程序员人生   发布时间:2016-09-26 08:06:51 阅读次数:3100次

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

Update (2015-02⑴0):

The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button  to reset your code definition.

判断数字的合法性

刚开始是把它作为1道细节较多的摹拟题做的,通过后去discuss看了1下,果然有优美的解答!

用有限状态机DFA解决,将每位看成1种状态转移条件,每次读取的1位,就根据转移矩阵进行状态转移,若转移到不合法的状态则返回false。

思路简单优美,不用斟酌过剩的细节问题,刷了这么多leetcode,这题真的眼前1亮!

具体的状态说明可以看这篇博客

class Solution { public: bool isNumber(string s) { int mp[9][6]={ {⑴, 0, 1, 2, ⑴, 3}, {⑴, ⑴, ⑴, 2, ⑴, 3}, {⑴, ⑴, ⑴, ⑴, ⑴, 4}, {⑴, 5, ⑴, 4, 6, 3}, {⑴, 5, ⑴, ⑴, 6, 4}, {⑴, 5, ⑴, ⑴, ⑴, ⑴}, {⑴, ⑴, 7, ⑴, ⑴, 8}, {⑴, ⑴, ⑴, ⑴, ⑴, 8}, {⑴, 5, ⑴, ⑴, ⑴, 8} }; int now=0; for(int i=0;i<s.size();i++) { switch(s[i]) { case '-': now=mp[now][2];break; case '+': now=mp[now][2];break; case ' ': now=mp[now][1];break; case '.': now=mp[now][3];break; case 'e': now=mp[now][4];break; case 'E': now=mp[now][4];break; default: { if(s[i]>='0' && s[i]<='9') now=mp[now][5]; else now=mp[now][0]; } } if(now==⑴) return false; } return now==3 || now==4 || now==5 || now==8 ; } };


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生