Valid Number(验证字符串是否表示数字)
2014-05-14 13:30
211 查看
原题链接:http://oj.leetcode.com/problems/valid-number/
Validate if a given string is numeric.
Some examples:
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.构造有穷自动机,不能有多个节点的环:
![](https://img-blog.csdn.net/20140514131725765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2ltcGxlbml1bHE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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;
}
};
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;
}
};
相关文章推荐
- Java正则表达式应用--验证字符串是否为数字
- 如何验证字符串是否为纯数字
- Java:验证字符串是否是数字
- C#验证字符串是否是数字,是否包括中文,是否是邮箱格式,是否是电话格式
- 是否以某字符串结尾 是否以某字符串开始 是否是整数 裁减字符串空格 是否是浮点数 是否所有字符为数字类型 是否为空 是否是EMAIL 是否是电话号码 身份证号码验证-支持新的带x身份证 日期验证
- 几种验证字符串是否全为数字方法的比较
- 验证字符串是否为数字
- 验证字符串是否全部为数字
- js 验证数字(验证字符串是否是数字)
- C#正则验证字符串是否全是数字
- C# 验证输入字符串是否为数字
- 【php】正则验证字符串是否为数字
- java正则表达式应用--验证字符串是否为数字
- java 验证邮箱格式正确性、验证字符串是否为数字
- java 验证邮箱格式正确性、验证字符串是否为数字
- java 验证邮箱格式正确性、验证字符串是否为数字
- java正则表达式应用--验证字符串是否为数字(转载)
- java 验证邮箱格式正确性、验证字符串是否为数字
- C#验证字符串是否是数字、传真、邮政编码、网址或者电子邮件
- C#验证给定字符串是否为数字的方法