DFA肯定有限狀態自動機

DFA

在計算理論中,肯定有限狀態自動機或肯定有限自動機(英語:deterministic finite automaton, DFA)是一個能實現狀態轉移的自動機。對於一個給定的屬於該自動機的狀態和一個屬於該自動機字母表Σ的字符,它都能根據事先給定的轉移函數轉移到下一個狀態(這個狀態能夠是先前那個狀態)。javascript

能夠經過創建狀態機來解決問題。
每次輸入都會引發狀態的改變或者不變。再次輸入一個值,狀態又會改變。
咱們把全部狀態羅列出來,每次輸入都改變他的狀態。若是最後的狀態是合法的,那麼證實這個輸入符合條件。java

例題

一個僅有ab的字符串,要求b須要成對出現,不然不合法。就是(a|bb)*正則的匹配。咱們能夠用dfa來作這個題。
數組

咱們能夠經過要求生成這樣一個自動機:
字符串一共有3種狀態,分別是沒有b的狀態或者b合法的狀態,「a」,只有一個b的臨時狀態「ab」,b不匹配的「aba」狀態。函數

  1. 沒有輸入的時候處於狀態1,當輸入一個a的時候仍是處於狀態1。
  2. 當輸入一個b的時候處於狀態2。變成「xxxxab」
  3. 當狀態2再輸入一個b,這是變成「abb」合法,又回到狀態1.
  4. 當狀態2再輸入一個a,這時變成了「aba」不合法狀態,成爲狀態3
  5. 狀態3不管輸入什麼都是不合法的,都是狀態3。

這時候能夠用一個數組表示這個狀態機: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

相關文章
相關標籤/搜索