Valid Number(验证字符串是否表示数字)
来源:互联网 发布:linux就该这么学作者 编辑:程序博客网 时间:2024/05/18 01:14
原题链接:http://oj.leetcode.com/problems/valid-number/
Validate if a given string is numeric.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
要求完成如下函数:
class Solution{public: bool isNumber(const char *s) { }}
解决方案:采用有穷自动机可以直观地描述所有可能的数字表达方式。
对于输入的字符串,按照输入在自动机上转换状态,待输入结束时到达可接受状态则为true,否则为false。
1.分析所有的输入可能:
INVALID:%,&,$等无效输入,除过下面几种。
SPACE:空格
SIGN:符号+/-
DIGIT:数字0-9
DOT:点.
EXPONENT:指数符号e|E
2.所有合法输入的可能:
(1):空格 数字 空格,如" 123 "
(2):空格 数字 点 数字 空格,如" 123.4 "
(3):空格 点 数字 空格,如" .123 "
(4):空格 正负号 数字 空格,如" +/-123 "
(5):空格 正负号 数字 点 数字 空格,如" +/-123.4 "
(6):空格 正负号 点 数字 空格,如" +/-.1234 "
(7):空格 {(1)|(2)|(3)|(4)|(5)|(6)}e|E{(1)|(4)} 空格,如" +/-123.4E123 "," .1234e+/-123 "
如上描述包含了所有的合法输入来表达数字,因此下一步就是用有穷自动机来描述着7种可能。
3.构造有穷自动机,不能有多个节点的环:
state 0:初始状态。
state 1:可接受状态,表示合法输入情况(1)(4)
state 2:接受点
state 3:接受正负号
state 4:接受点或者数字,可接受状态,表示合法输入情况(2)(5)
state 5:接受数字,可接受状态,表示合法输入情况(2)(3)(5)(6)
state 6:接受e|E
state 7:接受正负号
state 8:接受数字,可接受状态,表示合法输入情况(7)
state 9:接受空格,可接受状态,表示合法输入情况(1)(2)(3)(4)(5)(6)(7)
state -1:拒绝状态,表示非法输入
4.写出自动机的状态转换矩阵:
int transitionTable_9[][6]= { -1, 0, 3, 1, 2, -1,//state 0 -1, 9, -1, 1, 4, 6,//state 1 -1, -1, -1, 5, -1, -1,//state 2 -1, -1, -1, 1, 2, -1,//state 3 -1, 9, -1, 5, -1, 6,//state 4 -1, 9, -1, 5, -1, 6,//state 5 -1, -1, 7, 8, -1, -1,//state 6 -1, -1, -1, 8, -1, -1,//state 7 -1, 9, -1, 8, -1, -1,//state 8 -1, 9, -1, -1, -1, -1,//state 9 };
每一行表示某一状态,在6种可能的输入下的状态转移。
5.编写代码:
对输入的字符串逐个字符遍历,根据有穷自动机进行状态转移,若输入结束时到达可接受状态则为true,否则为false。如下代码:
class Solution{public: bool isNumber(const char *s) { enum InputType { INVALID, // 0 SPACE, // 1 SIGN, // 2 DIGIT, // 3 DOT, // 4 EXPONENT, // 5 NUM_INPUTS // 6 }; int transitionTable_9[][NUM_INPUTS]= { -1, 0, 3, 1, 2, -1,//state 0 -1, 9, -1, 1, 4, 6,//state 1 -1, -1, -1, 5, -1, -1,//state 2 -1, -1, -1, 1, 2, -1,//state 3 -1, 9, -1, 5, -1, 6,//state 4 -1, 9, -1, 5, -1, 6,//state 5 -1, -1, 7, 8, -1, -1,//state 6 -1, -1, -1, 8, -1, -1,//state 7 -1, 9, -1, 8, -1, -1,//state 8 -1, 9, -1, -1, -1, -1,//state 9 }; int state = 0; while (*s != '\0') { InputType inputType = INVALID; if (isspace(*s)) inputType = SPACE; else if (*s == '+' || *s == '-') inputType = SIGN; else if (isdigit(*s)) inputType = DIGIT; else if (*s == '.') inputType = DOT; else if (*s == 'e' || *s == 'E') inputType = EXPONENT; state = transitionTable_9[state][inputType]; if (state == -1) return false; else ++s; } return state == 1 || state == 4 || state == 5 || state == 8 || state == 9; }};
- Valid Number(验证字符串是否表示数字)
- LeetCode Valid Number(判断字符串是否是合法的数字表示 )
- 每日算法之四十七:Valid Number (验证是否为数字)
- LeetCode65——Valid Number(使用DFA)来判断字符串是否为数字
- 65.Valid Number&表示数值的字符串
- Valid Number 判断一个数字是否有效
- 验证字符串是否为数字
- 【线性扫描i】 valid number 数字格式是否正确
- Leetcode 65. Valid Number 验证数字 解题报告
- 【LeetCode】- Valid Number(有效数字)
- LeetCode 65. Valid Number(校验数字)
- [LeetCode]—Valid Number 判断字符串是否为合法数据(科学计数法)
- java 验证字符串 是否为 数字
- C# 验证输入字符串是否为数字
- js java,验证字符串是否为数字
- 【php】正则验证字符串是否为数字
- php 正则验证字符串是否为数字
- 验证字符串是否全部为数字
- win32编程的经典书籍
- 关于地图
- zookeeper学习笔记:zookeeper安装配置
- OpenCV中Mat数据结构
- 数据链路
- Valid Number(验证字符串是否表示数字)
- Sparsity稀疏编码(三) (值得阅读)
- js动态增加(删除)table数据行的功能
- Spring中Annotation的简单介绍
- CKeditor 配置使用
- Web Services 简介
- 每日一得--JAVA的中文字符乱码问题
- cgi 上传文件(c 语言) 进度条显示
- Java学习笔记一