C++ 中用於識別不以“THE”結尾的字串的 DFA?


為了使用確定性有限自動機 (DFA) 查詢不以子字串“THE”結尾的字串,我們應該記住,“THE”的任何變體,例如“tHe”、“The”、“ThE”等都不應位於字串的末尾。

首先,我們定義 dfa 變數並將其初始化為 0,這可以跟蹤我們的狀態。在匹配每個字元時都會遞增。

int dfa = 0;

begin(char c) 方法接受一個字元,並檢查它是否為 't' 或 'T',然後進入第一狀態,即 1。

void begin(char c){
   if (c == 't' || c == 'T')
   dfa = 1;
}

firstState(char c) 方法檢查第一個字元並根據該值分配 dfa。如果 c 為 't' 或 'T',則我們進入第一狀態;如果 c 為 'h' 或 'H',則我們進入第二狀態;最後,如果它是其他字元,則我們進入起始狀態,即 0。

void firstState(char c){
   if (c == 't' || c == 'T')
      dfa = 1;
   else if (c == 'h' || c == 'H')
      dfa = 2;
   else
      dfa = 0;
}

secondState(char c) 接受一個字元,用於檢查 DFA 的第二狀態。如果傳入的字元等於 'E' 或 'e',則我們進入第三狀態,否則進入起始狀態,即 0。

void secondState(char c){
   if (c == 'e' || c == 'E')
      dfa = 3;
   else
      dfa = 0;
}

thirdState(char c) 接受一個字元,用於檢查 DFA 的第三狀態。如果字元等於 't' 或 'T',則我們進入第一狀態 (1),否則進入起始狀態,即 0。

void thirdState(char c){
   if (c == 't' || c == 'T')
      dfa = 1;
   else
      dfa = 0;
}

isAccepted(string str) 將要測試的字串作為引數。len 變數儲存字串的長度。for 迴圈迭代到字串長度。如果 dfa = 0,則呼叫 start(char c) 函式;如果 dfa 等於 1,則呼叫 firstState(char c) 函式;如果 dfa 等於 2,則呼叫 secondState(char c) 函式;如果 dfa 不等於 1、2、3,則呼叫 thirdState(char c) 函式。我們根據 dfa 是否為 3 返回 true 或 false。如果 dfa 不等於 3,則接受字串,否則不接受。

bool isAccepted(string str){
   int len = str.length();
   for (int i=0; i < len; i++) {
      if (dfa == 0)
         begin(str[i]);
      else if (dfa == 1)
         firstState(str[i]);
      else if (dfa == 2)
         secondState(str[i]);
      else
         thirdState(str[i]);
   }
   return (dfa != 3);
}

示例

讓我們來看一下以下實現,以查詢不以“THE”結尾的字串的 DFA:

 線上演示

#include <iostream>
#include <string>
using namespace std;
int dfa = 0;
void begin(char c){
   if (c == 't' || c == 'T')
      dfa = 1;
}
void firstState(char c){
   if (c == 't' || c == 'T')
      dfa = 1;
   else if (c == 'h' || c == 'H')
      dfa = 2;
   else
      dfa = 0;
}
void secondState(char c){
   if (c == 'e' || c == 'E')
      dfa = 3;
   else
      dfa = 0;
}
void thirdState(char c){
   if (c == 't' || c == 'T')
      dfa = 1;
   else
      dfa = 0;
}
bool isAccepted(string str){
   int len = str.length();
   for (int i=0; i < len; i++) {
      if (dfa == 0)
         begin(str[i]);
      else if (dfa == 1)
         firstState(str[i]);
      else if (dfa == 2)
         secondState(str[i]);
      else
         thirdState(str[i]);
   }
   return (dfa != 3);
}
int main(){
   string str = "helloForTheWorld";
   if (isAccepted(str) == true)
      cout<<"The string "<<str<<" is accepted ";
   else
      cout<<"The string "<<str<<" is not accepted";
   return 0;
}

輸出

以上程式碼將產生以下輸出:

The string helloForTheWorld is accepted

更新於:2021年1月16日

264 次瀏覽

開啟您的 職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.