leetcode-65 valid number

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.


这道题有些难,主要是需要考虑的情况比较多,如果一次次加条件进行约束,比较繁琐,难以顾及到所有的情况,参考了一些博客,比较舒服的做法是有限状态机的思想,在此感谢http://blog.csdn.net/suwei19870312/article/details/12094233以及http://www.cnblogs.com/zuoyuan/p/3703075.html

说到有限状态机就需要知道,有几种状态可以进行转移。

首先,可输入的字符有6种情况,用0~5来表示

0:无效的字符,{},abc...

1 : 空格

2 : 符号  +/-

3 : 数字 0~9

4 : 小数点  .

5 : 指数  e/E

这五种输入对应有9种可转移的状态,输入一个字符可能处于以下几种状态

0:初始状态,无输入或者是空格

1:数字

2:点

3:符号

4:数字+点/ 点+数字

5:e/E

6:e/E+符号

7:e/E+数字

8:有效输入+空格


对应转移矩阵

int trans[][6] = {
   -1, 0, 3, 1, 2, -1,
   -1, 8, -1, 1, 4, 5,
   -1, -1, -1, 4, -1, -1,
   -1, -1, -1, 1, 2, -1,
   -1, 8, -1, 4, -1, 5,
   -1, -1, 6, 7, -1, -1,
   -1, -1, -1, 7, -1, -1,
   -1, 8, -1, 7, -1, -1,
   -1, 8, -1, -1, -1, -1
  };

最终可以接受的状态为1,4,7,8,代码如下:

class Solution {
public:
	bool isNumber(string s) 
	{
		//定义枚举类型,列举输入字符的几种可能性
		enum InputType
		{
			invalid = 0,
			space = 1,
			sign = 2,
			num = 3,
			dot = 4,
			exponent=5
		};

		//定义状态转移矩阵
		int trans[][6] = {
			-1, 0, 3, 1, 2, -1,
			-1, 8, -1, 1, 4, 5,
			-1, -1, -1, 4, -1, -1,
			-1, -1, -1, 1, 2, -1,
			-1, 8, -1, 4, -1, 5,
			-1, -1, 6, 7, -1, -1,
			-1, -1, -1, 7, -1, -1,
			-1, 8, -1, 7, -1, -1,
			-1, 8, -1, -1, -1, -1
		};

		//初始状态
		int state = 0;
		int n = s.size();
		int i = 0;
		int step;
		while (i < n)
		{
			if (s[i] == ' ')
				step = space;
			else if (s[i] == '+' || s[i] == '-')
				step = sign;
			else if (s[i] >= '0'&&s[i] <= '9')
				step = num;
			else if (s[i] == '.')
				step = dot;
			else if (s[i] == 'e' || s[i] == 'E')
				step = exponent;
			else
				step = invalid;

			state = trans[state][step];
			if (state == -1)
				return false;
			else
				i++;
		}
		if (state == 1 || state == 4 || state == 7 || state == 8)
			return true;
		else
			return false;
	}
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值