有限状态自动机是什么?
其实我之前做算法题看题解的时候经常看到有状态转移的方法(动态规划的那种转移除外)
今天碰到一个字符串中匹配数字的,其中之一有小数或科学计算法的数或正数负数就是TRUE,否则为false。
在计算理论中,确定有限状态自动机或确定有限自动机(英语:deterministic finite automaton, DFA)是一个能实现状态转移的自动机。对于一个给定的属于该自动机的状态和一个属于该自动机字母表Σ的字符,它都能根据事先给定的转移函数转移到下一个状态(这个状态可以是先前那个状态)。
重点
找到所有状态罗列出来,建立每次输入都改变他状态的状态转移。如果最后的状态是合法的,那么证明这个输入符合条件。
对于例题
一个仅有ab的字符串,要求b需要成对出现,否则不合法。
那么就是需要a或者abb两种
第一个状态是a
第二个是ab,那么此时怎么转移,如果下一个是a,出现aba不合法,即
第三个状态aba,然后无论输入什么只能在第三个停留,直到输出
如果ab后输入是b那么合法,要画第四个状态abb吗?当然不能,因为abb合法之后,下一步还有可能是a或b,所以自己是回到第一个状态,从这个新起点开始判断后续是否合法
一个自环表示状态还在这里没有转移走,要判断输出,只要在所有状态里找出合法状态即可,如果只有abb怎么转移都是停在状态1,所以判断最后停下来是不是等于1
实战
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
状态有什么
0表示空格
1表示e前边的±号
2表示小数点前的数字
3表示小数点、小数点后的数字
4表示当小数点前为空格时小数点、小数点后的数字
5表示e
6表示e后的正负号
7表示e后的数字
8表示结尾的空格
其实我也不一定能画出来,图来自leetcode。
开始写代码实现
第一步构建状态转移
/*
* 0表示空格
1表示e前边的+-号
2表示小数点前的数字
3表示小数点、小数点后的数字
4表示当小数点前为空格时小数点、小数点后的数字
5表示e
6表示e后的正负号
7表示e后的数字
8表示结尾的空格
*/
Map[] states = {
new HashMap<Character, Integer>() {
{
put(' ', 0); put('d', 2); put('s', 1); put('.',