确定有限自动机 valid number
原题地址:http://oj.leetcode.com/problems/valid-number/
题意:判断输入的字符串是否是合法的数。
解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较优雅。本文参考了http://www.cnblogs.com/zuoyuan/p/3703075.html里面的内容,在此致谢!
先要知道到底哪些数是合理的。
e之前呢。
123
.123
123.456
123.
+123
+.123
e之后
123
+123
首先这个题有9种状态:
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;#无效输入包括: Alphas, '(', '&' ans so on
SPACE=1
SIGN=2 # '+' or '-'
DIGIT=3 # numbers
DOT=4 # '.'
EXPONENT=5 # 'e' or 'E'
转移矩阵A(9X6)如下:
-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
行代表了9种状态,列代表了6种输入方式也就是6种跳转方式。举个例子:A[0][2]=3,这有什么含义呢?意思是:第0种状态为【0初始无输入或者只有space的状态】,在输入第2种输入【SIGN=2 # '+' or '-'】后,会跳转到第3种状态【3输入了符号状态】。A[1][1]=8是什么意思呢?意思是:第1种状态为【1输入了数字之后的状态】,在输入第1种输入【SPACE=1】后,跳转到了第8种状态【8前面有有效数输入之后,输入space的状态】。
根据以上的解释,大家应该明白什么事状态间的跳转了,这个共9种状态,所以是确定有穷自动机。其实难点在于状态的分割,要把每种情况都想到。
而这9种状态中:只有1、4、7、8这四种状态合法,所以最后state跳转到这四种状态之一时,说明输入是合法的!
状态转移图 from leetcode discuss:
代码:
按 Ctrl+C 复制代码
class Solution:
# @param s, a string
# @return a boolean
# @finite automation
def isNumber(self, s):
INVALID=0; SPACE=1; SIGN=2; DIGIT=3; DOT=4; EXPONENT=5;
#0invalid,1space,2sign,3digit,4dot,5exponent,6num_inputs
transitionTable=[[-1, 0, 3, 1, 2, -1], #0 no input or just spaces
[-1, 8, -1, 1, 4, 5], #1 input is digits
[-1, -1, -1, 4, -1, -1], #2 no digits in front just Dot
[-1, -1, -1, 1, 2, -1], #3 sign
[-1, 8, -1, 4, -1, 5], #4 digits and dot in front
[-1, -1, 6, 7, -1, -1], #5 input 'e' or 'E'
[-1, -1, -1, 7, -1, -1], #6 after 'e' input sign
[-1, 8, -1, 7, -1, -1], #7 after 'e' input digits
[-1, 8, -1, -1, -1, -1]] #8 after valid input input space
state=0; i=0
while i<len(s):
inputtype = INVALID
if s[i]==' ': inputtype=SPACE
elif s[i]=='-' or s[i]=='+': inputtype=SIGN
elif s[i] in '0123456789': inputtype=DIGIT
elif s[i]=='.': inputtype=DOT
elif s[i]=='e' or s[i]=='E': inputtype=EXPONENT state=transitionTable[state][inputtype]
if state==-1: return False
else: i+=1
return state == 1 or state == 4 or state == 7 or state == 8
确定有限自动机 valid number的更多相关文章
- 【leetcode】Valid Number
Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 ...
- [LintCode] Valid Number 验证数字
Validate if a given string is numeric. Have you met this question in a real interview? Yes Example & ...
- Valid Number @python
Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 ...
- 配置域名服务器报错named[822]: dns_rdata_fromtext /etc/bind/db.asertest.com mail not a valid number
问题描述: 为了配置邮件服务器,更改了相关域名,改完后,重启bind9报错 Mar 17 14:39:39 DnsServer2 named[822]: dns_rdata_fromtext: /et ...
- [Swift]LeetCode65. 有效数字 | Valid Number
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- [leetcode]65. Valid Number 有效数值
Validate if a given string can be interpreted as a decimal number. Some examples:"0" => ...
- 【LeetCode】65. Valid Number
Difficulty: Hard More:[目录]LeetCode Java实现 Description Validate if a given string can be interpreted ...
- LeetCode: Valid Number 解题报告
Valid NumberValidate if a given string is numeric. Some examples:"0" => true" 0.1 ...
- leetCode 65.Valid Number (有效数字)
Valid Number Validate if a given string is numeric. Some examples: "0" => true " ...
随机推荐
- 用UIScrollView产生视差效果
用UIScrollView产生视差效果 效果: 高级效果: 源码: MoreInfoView.h + MoreInfoView.m // // MoreInfoView.h // YXCell / ...
- 利用Linode面板Clone克隆搬家迁移不同VPS数据及利用IP Swap迁移IP地址
在众多海外VPS服务商中,老蒋个人认为Linode提供的VPS方案和性价比还是比较高的,尤其目前基础1GB方案仅需10美元每月且全部是SSD固态硬盘,无论是流量还是硬盘大小,基本上可以满足我们大部分用 ...
- Logstash和Flume-NG Syslog接收小测试
目前在大规模日志处理平台中常见的日志采集器可以采用Logstash或Flume.这两种日志采集器架构设计理念基本相似,都采用采集-过滤处理-输出的方式.下面对这两种采集器Syslog接收性能做个简单测 ...
- django 错误之 OSError: mysql_config not found
pip 导入包时出现如下错误 Complete output from command python setup.py egg_info: /bin/: mysql_config: not found ...
- Python的网络编程 Socket编程
Socket是进程间通信的一种方式,与其他进程间通信的一个主要不同是:能实现不同主机间的进程间通信,网络上各种各样的服务大多都是基于Socket来完成通信的,要解决网络上两台主机间的通信问题,首先要唯 ...
- adb shell 运行时报错"adb server version (26) doesn't match this client (39); killing..."的解决方案
adb即 Android Debug Bridge 是一个通用的命令行工具,可用于通过PC端对连接的Android模拟器设备或连接至电脑的真实物理设备进行命令行操作.目前,许多软件均会借助 adb 工 ...
- ios的图片解压
YYKit SDWebImage FLAnimatedImage YYKit YYCGImageCreateDecodedCopy YYImageCoder 1 2 3 4 5 6 7 8 9 10 ...
- 1305. [CQOI2009]跳舞【最大流+二分】
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- shell基础--test命令的使用
test :用于文件类型检查和变量比较 一.用途: 1.判断表达式 2.判断字符串 3.判断整数 4.判断文件 测试例子: (1).test [root@~_~ day5]# cat test.sh ...
- virtualbox+vagrant学习-2(command cli)-27-vagrant connect命令
Connect 命令: vagrant connect NAME connect命令通过启用对共享环境的访问来补充share命令.你可以在“vagrant share”部分了解有关vagrant sh ...