题目描述
验证指定的字符串是否可以解释为十进制。样本:
'0'=真
0.1=真
' ABC '=假
'1a '=假
' 2e 10 '=真
'-90 E3 '=真
1e=假
E3=假
' 6e-1 '=真
' 99e 2.5 '=假
' 53.5 e93 '=真
'--6'=假
'-3 '=假
' 95 a 54e 53 '=假
数字: 0-9
小数点:
符号:-
看到指数: e
解题思路
问题的学生应该发现,如果使用Python,大多数人会直接调用float函数,如果转换成功则返回True,如果抛出异常则返回False。 不得不说正是zqdsj。 但是,用这种方法求解对提高自己没有多大帮助。 下面说明使用自动机的方法我们的目标是建立DFA。 模拟输入字符串在DFA上的行为。 处理最后一个输入的字符后,如果DFA处于接受状态,则可以将该字符串解释为十进制。 否则,就不能。 但是,直接构建满足条件的DFA很难,必须经过曲线救国的过程。 首先,必须构建与所需字符串匹配的正则表达式。 基于正则表达式构建对应的NFA,最后将NFA转换为等价的DFA。 有了这个DFA,就可以构筑对应的状态变换表,在代码中使用。
如何制定与十进制一致的正则表达式? 首先说一下我的想法,十进制可以分为三个部分,即: 1 )符号位; 2 )基础; 3 )乘方例如,“-123.32e 4”时,符号的比特和乘方可以为空,写这两部分的正则比较简单。 base的部分有“23 .”、“23”、“. 34”四种形式,写与这四种形式一致的正则也比较简单,所以请试着自己实现各部分的正则。 各部分的
正则化成立后,就可以构筑对应的NFA了。 but how? 首先来看正则表达式,主要包括连接或闭包三个基本操作,更复杂的正则表达式也是这三个基本操作的组合,只要知道这三个基本操作的NFA是如何构成的,就可以构建与上面得到的正则表达式相对应的NFA
有了NFA,就需要构建等效的DFA。 等价是指两者接收的字符串集合相同。 由于NFA的状态迁移不确定,因此转换为DFA后容易进行模拟。 通常使用子集构建算法进行从NFA到DFA的转换,但是为了得到DFA的状态转换表,这里基于先前计算的NFA手动模拟子集构建算法的执行,得到的状态转换表为以下:
DFA状态转移表
其中,状态2、4、5、7、8、10为接受状态
代码实现
级解决方案3360表=[
1,2,3,-1,-1,
[-1,2,3,-1,-1]、
[-1,4,5,6,-1]、
[-1,7,-1,-1,-1]、
[-1,4,8,6,-1]、
[-1,7,- 1,6,-1]、
[ 9,10,-1,-1,-1]、
[-1,7,- 1,6,-1]、
[-1,8,- 1,6,-1]、
[-1,10,-1,-1,-1]、
[-1,10,-1,-1,-1]
]
finals=[ 0,0,1,0,1,1,0,1,1,0,1 ]
自由号(s: str ) -布尔:
返回解决方案. DFA (s (
@静态方法
EFDFA(s:str ) -布尔:
s=秒()
q=0 # DFA的初始状态
在s :上
q=解决方案.移动(q,ch ) )。
# #跟踪状态转移
# #打印(状态: % d ) % q ) )
if q==-1:
返回假
返回解决方案.金融==1
@静态方法
def move (q :英寸,通道) :
if ch in ' -':
idx=0
elif ch in '0123456789':
idx=1
'.' :生命周期
idx=2
' e ' :生命中
idx=3
else:
idx=4
return Solution.table[q][idx]享受更多的leet代码问题。