在计算理论中,肯定有限状态自动机或肯定有限自动机(英语:deterministic finite automaton, DFA)是一个能实现状态转移的自动机。对于一个给定的属于该自动机的状态和一个属于该自动机字母表Σ的字符,它都能根据事先给定的转移函数转移到下一个状态(这个状态能够是先前那个状态)。javascript
能够经过创建状态机来解决问题。
每次输入都会引发状态的改变或者不变。再次输入一个值,状态又会改变。
咱们把全部状态罗列出来,每次输入都改变他的状态。若是最后的状态是合法的,那么证实这个输入符合条件。java
一个仅有ab的字符串,要求b须要成对出现,不然不合法。就是(a|bb)*
正则的匹配。咱们能够用dfa来作这个题。
数组
咱们能够经过要求生成这样一个自动机:
字符串一共有3种状态,分别是没有b的状态或者b合法的状态,“a”,只有一个b的临时状态“ab”,b不匹配的“aba”状态。函数
这时候能够用一个数组表示这个状态机:code
a b 1 1 2 2 3 1 3 3 3
把ab也用1,2表示。blog
var runs = function(str) { var dfa = [ [], [1, 2], [3, 1], [3, 3], ]; var state = 1; for (var i = 0; i < str.length; i++) { if(str[i] == 'a'){ state = dfa[state][0]; } else if(str[i] == "b") { state = dfa[state][1]; } if(state === 3) { return state; } } return state }; console.log(runs("abbaaa"))
当最后一个输入结束以后,看一下最后的状态是处于状态几,经过自动机能够发现,只有在状态1的时候是合法的。因此我只须要判断state === 1.ip