在計算理論中,肯定有限狀態自動機或肯定有限自動機(英語: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