ในการใช้ Deterministic Finite Automaton(DFA) เพื่อค้นหาสตริงที่ไม่ได้ลงท้ายด้วยสตริงย่อย “THE” เราควรจำไว้ว่าการเปลี่ยนแปลงใดๆ ของสตริงย่อย “THE” เช่น “tHe”, “The” ”The” ฯลฯ ไม่ควรอยู่ที่ส่วนท้ายของสตริง
ขั้นแรก เรากำหนดตัวแปร dfa ของเราและกำหนดค่าเริ่มต้นเป็น 0 ซึ่งจะคอยติดตามสถานะของเรา จะเพิ่มขึ้นในแต่ละอักขระที่ตรงกัน
int dfa = 0;
วิธี start(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 loop วนซ้ำจนถึงความยาวของสตริง ถ้า dfa =0 ฟังก์ชัน start(char c) จะถูกเรียก ถ้า dfa เท่ากับ 1 ฟังก์ชัน firstState(char c) จะถูกเรียก และถ้า dfa เท่ากับ 2 ฟังก์ชัน secondState(char c) จะถูกเรียก และถ้า dfa ไม่ใช่ t 1,2,3 จากนั้นจึงเรียกฟังก์ชัน thirdState(char c) เราคืนค่าจริงหรือเท็จโดยพิจารณาว่า dfa เป็น 3 หรือไม่ หาก dfa ไม่เท่ากับสาม แสดงว่าสตริงนั้นไม่ยอมรับ
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);
} ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อค้นหา DFA สำหรับสตริงที่ไม่ลงท้ายด้วย “THE” -
#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