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-10):
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、参考文章:
http://www.cnblogs.com/zuoyuan/p/3703075.html
http://blog.youkuaiyun.com/yeruby/article/details/46851107
这题只能用确定有穷状态自动机(DFA)来写会比较优雅。
注释一下本题分多少状态吧:
0初始无输入或者只有space的状态
1输入了数字之后的状态
2前面无数字,只输入了Dot的状态
3输入了符号状态
4前面有数字和有dot的状态
5'e' or 'E'输入后的状态
6输入e之后输入Sign的状态
7输入e后输入数字的状态
8前面有有效数输入之后,输入space的状态
共9种状态了,难设计的是6,7,8状态。
分好之后就好办了,设计出根据输入进行状态转换就OK了。
这里的输入可以分:
INVALID,
// 0 Include: Alphas, '(', '&' ans so on
SPACE,
// 1
SIGN, // 2 '+','-'
DIGIT,
// 3 numbers
DOT, // 4 '.'
EXPONENT,
// 5 'e' 'E'
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Solution_065_ValidNumber
{
public:
bool isNumber(string s)
{
enum InputType
{
INVALID,
SPACE,
SIGN,
DIGIT,
DOT,
EXPONENT,
};
int transTable[][6] = {
-1, 0, 3, 1, 2, -1,//0初始无输入或者只有space的状态
-1, 8, -1, 1, 4, 5,//1输入了数字之后的状态
-1, -1, -1, 4, -1, -1,//2前面无数字,只输入了Dot的状态
-1, -1, -1, 1, 2, -1,//3输入了符号状态
-1, 8, -1, 4, -1, 5,//4前面有数字和有dot的状态
-1, -1, 6, 7, -1, -1,//5'e' or 'E'输入后的状态
-1, -1, -1, 7, -1, -1,//6输入e之后输入Sign的状态
-1, 8, -1, 7, -1, -1,//7输入e后输入数字的状态
-1, 8, -1, -1, -1, -1,//8前面有有效数输入之后,输入space的状态
};
int state = 0;
int i = 0;
while (s[i])
{
InputType input = INVALID;
if (s[i] == ' ')
{
input = SPACE;
}
else if (s[i] == '+' || s[i] == '-')
{
input = SIGN;
}
else if (isdigit(s[i]))
{
input = DIGIT;
}
else if (s[i] == '.')
{
input = DOT;
}
else if (s[i] == 'e' || s[i] == 'E')
{
input = EXPONENT;
}
state = transTable[state][input];
if (state == -1)
{
return false;
}
i++;
}
return state == 1 || state == 4 || state == 7 || state == 8;
}
};