先决条件——有限自动机简介
问题:设计一个确定性有限自动机 (DFA) 来接受语言
上述语言 L 的正则表达式是,
L = (aa)*.b+
例子:
Input: a a b b b
Output: ACCEPTED
// n = 2 (even) m=3 (>=1)
Input: a a a b b b
Output: NOT ACCEPTED
// n = 3 (odd), m = 3
Input: a a a a
Output: NOT ACCEPTED
// n = 4, m = 0( must be >=1)
方法:
有 3 个步骤导致接受字符串:
- 为意味着有偶数个a。
- 为表示具有大于 1 的任意数量的 b。
- 连接两个 FA 并制作单个 DFA。
任何其他组合结果都是拒绝输入字符串。
- 描述:
鉴于 DFA 具有以下状态。状态 3 导致接受字符串,而状态 0、1、2 和 4 导致拒绝字符串。DFA 状态转换图:
让我们看看演示的代码:
C/C++
// C program to implement DFS that accepts // all string which follow the language // L = { a^n b^m ; (n)mod 2=0, m>=1 } #include
#include // dfa tells the number associated // string end in which state. int dfa = 0; // This function is for // the starting state (Q0)of DFA void start(char c) { if (c == 'a') { dfa = 1; } else if (c == 'b') { dfa = 3; } // -1 is used to check for any invalid symbol else { dfa = -1; } } // This function is for the first state (Q1) of DFA void state1(char c) { if (c == 'a') { dfa = 2; } else if (c == 'b') { dfa = 4; } else { dfa = -1; } } // This function is for the second state (Q2) of DFA void state2(char c) { if (c == 'b') { dfa = 3; } else if (c == 'a') { dfa = 1; } else { dfa = -1; } } // This function is for the third state (Q3)of DFA void state3(char c) { if (c == 'b') { dfa = 3; } else if (c == 'a') { dfa = 4; } else { dfa = -1; } } // This function is for the fourth state (Q4) of DFA void state4(char c) { dfa = -1; } int isAccepted(char str[]) { // store length of string int i, len = strlen(str); for (i = 0; i < len; i++) { if (dfa == 0) start(str[i]); else if (dfa == 1) state1(str[i]); else if (dfa == 2) state2(str[i]); else if (dfa == 3) state3(str[i]); else if (dfa == 4) state4(str[i]); else return 0; } if (dfa == 3) return 1; else return 0; } // driver code int main() { char str[] = "aaaaaabbbb"; if (isAccepted(str)) printf("ACCEPTED"); else printf("NOT ACCEPTED"); return 0; } // This code is contributed by SHUBHAMSINGH10.
Java
// Java program to implement DFS that accepts // all string which follow the language // L = { a^n b^m ; (n)mod 2=0, m>=1 } class GFG { // dfa tells the number associated // string end in which state. static int dfa = 0; // This function is for // the starting state (Q0)of DFA static void start(char c) { if (c == 'a') { dfa = 1; } else if (c == 'b') { dfa = 3; } // -1 is used to check for // any invalid symbol else { dfa = -1; } } // This function is for the // first state (Q1) of DFA static void state1(char c) { if (c == 'a') { dfa = 2; } else if (c == 'b') { dfa = 4; } else { dfa = -1; } } // This function is for the // second state (Q2) of DFA static void state2(char c) { if (c == 'b') { dfa = 3; } else if (c == 'a') { dfa = 1; } else { dfa = -1; } } // This function is for the // third state (Q3)of DFA static void state3(char c) { if (c == 'b') { dfa = 3; } else if (c == 'a') { dfa = 4; } else { dfa = -1; } } // This function is for the // fourth state (Q4) of DFA static void state4(char c) { dfa = -1; } static int isAccepted(char str[]) { // store length of string int i, len = str.length; for (i = 0; i < len; i++) { if (dfa == 0) start(str[i]); else if (dfa == 1) state1(str[i]); else if (dfa == 2) state2(str[i]); else if (dfa == 3) state3(str[i]); else if (dfa == 4) state4(str[i]); else return 0; } if (dfa == 3) return 1; else return 0; } // Driver code public static void main(String []args) { char str[] = "aaaaaabbbb".toCharArray(); if (isAccepted(str) == 1) System.out.printf("ACCEPTED"); else System.out.printf("NOT ACCEPTED"); } } // This code is contributed by 29AjayKumar
Python 3
# Python3 program to implement DFS that accepts # all Stringing which follow the language # L = {a ^ n b ^ m (n)mod 2 = 0, m>= 1 } # This function is for the dfa = starting # dfa = state (zeroth) of DFA def start(c): if (c == 'a'): dfa = 1 elif (c == 'b'): dfa = 3 # -1 is used to check for any # invalid symbol else: dfa = -1 return dfa # This function is for the first # dfa = state of DFA def state1(c): if (c == 'a'): dfa = 2 elif (c == 'b'): dfa = 4 else: dfa = -1 return dfa # This function is for the second # dfa = state of DFA def state2(c): if (c == 'b'): dfa = 3 elif (c == 'a'): dfa = 1 else: dfa = -1 return dfa # This function is for the third # dfa = state of DFA def state3(c): if (c == 'b'): dfa = 3 elif (c == 'a'): dfa = 4 else: dfa = -1 return dfa # This function is for the fourth # dfa = state of DFA def state4(c): dfa = -1 return dfa def isAccepted(String): # store length of Stringing l = len(String) # dfa tells the number associated # with the present dfa = state dfa = 0 for i in range(l): if (dfa == 0): dfa = start(String[i]) elif (dfa == 1): dfa = state1(String[i]) elif (dfa == 2) : dfa = state2(String[i]) elif (dfa == 3) : dfa = state3(String[i]) elif (dfa == 4) : dfa = state4(String[i]) else: return 0 if(dfa == 3) : return 1 else: return 0 # Driver code if __name__ == "__main__" : String = "aaaaaabbbb" if (isAccepted(String)) : print("ACCEPTED") else: print("NOT ACCEPTED") # This code is contributed by SHUBHAMSINGH10.
C#
// C# program to implement DFS that accepts // all string which follow the language // L = { a^n b^m ; (n)mod 2=0, m>=1 } using System; class GFG { // dfa tells the number associated // string end in which state. static int dfa = 0; // This function is for // the starting state (Q0)of DFA static void start(char c) { if (c == 'a') { dfa = 1; } else if (c == 'b') { dfa = 3; } // -1 is used to check for // any invalid symbol else { dfa = -1; } } // This function is for the // first state (Q1) of DFA static void state1(char c) { if (c == 'a') { dfa = 2; } else if (c == 'b') { dfa = 4; } else { dfa = -1; } } // This function is for the // second state (Q2) of DFA static void state2(char c) { if (c == 'b') { dfa = 3; } else if (c == 'a') { dfa = 1; } else { dfa = -1; } } // This function is for the // third state (Q3)of DFA static void state3(char c) { if (c == 'b') { dfa = 3; } else if (c == 'a') { dfa = 4; } else { dfa = -1; } } // This function is for the // fourth state (Q4) of DFA static void state4(char c) { dfa = -1; } static int isAccepted(char []str) { // store length of string int i, len = str.Length; for (i = 0; i < len; i++) { if (dfa == 0) start(str[i]); else if (dfa == 1) state1(str[i]); else if (dfa == 2) state2(str[i]); else if (dfa == 3) state3(str[i]); else if (dfa == 4) state4(str[i]); else return 0; } if (dfa == 3) return 1; else return 0; } // Driver code public static void Main(String []args) { char []str = "aaaaaabbbb".ToCharArray(); if (isAccepted(str) == 1) Console.Write("ACCEPTED"); else Console.Write("NOT ACCEPTED"); } } // This code is contributed by 29AjayKumar
PHP
=1 } // This function is for the starting // state (zeroth) of DFA function start($c, &$dfa) { if($c == 'a') $dfa = 1; elseif ($c == 'b') $dfa = 3; // -1 is used to check for any // invalid symbol else $dfa = -1; } // This function is for the first // state of DFA function state1($c, &$dfa) { if ($c == 'a') $dfa = 2; elseif ($c == 'b') $dfa = 4; else $dfa = -1; } // This function is for the second // state of DFA function state2($c, &$dfa) { if ($c == 'b') $dfa = 3; elseif ($c == 'a') $dfa = 1; else $dfa = -1; } // This function is for the third // state of DFA function state3($c, &$dfa) { if ($c == 'b') $dfa = 3; elseif ($c == 'a') $dfa = 4; else $dfa = -1; } // This function is for the fourth // state of DFA function state4($c, &$dfa) { $dfa = -1; } function isAccepted($str,&$dfa) { // store length of string $i = 0; $len = sizeof($str); for ($i = 0; $i < $len; $i++) { if ($dfa == 0) start($str[$i], $dfa); elseif ($dfa == 1) state1($str[$i], $dfa); elseif ($dfa == 2) state2($str[$i], $dfa); elseif ($dfa == 3) state3($str[$i], $dfa); elseif ($dfa == 4) state4($str[$i], $dfa); else return 0; } if($dfa == 3) return 1; else return 0; } // Driver Code // dfa tells the number associated // with the present state $dfa = 0; $str = array("a", "a", "a", "a", "a", "a", "b", "b", "b", "b"); if (isAccepted($str, $dfa) != 0) echo "ACCEPTED"; else echo "NOT ACCEPTED"; // This code is contributed // by Adesh Singh ?>
输出:
ACCEPTED