65 - Valid Number(DFA-Deterministic Finite Automaton)

本文介绍了一种使用确定有穷状态自动机(DFA)的方法来判断一个字符串是否能表示一个有效的浮点数。通过定义9种状态和6种输入类型,实现了一个高效的状态转移表,最终能够准确判断各种复杂格式的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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://blog.youkuaiyun.com/kenden23/article/details/18696083
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;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值