Construct a DFA which accept the language L = {anbm | n > =1, (m) mod 3 = 1}

• Difficulty Level : Hard
• Last Updated : 11 Jul, 2019

Problem: Construct a DFA which accept the language L = {anbm | n > =1, (m) mod 3 = 1}.

Explanation:
For constructing the DFA, the following things to be remember:

``` which means any no of elements, and
=  which means any no of elements greater than 1.```

Examples:

```Input: a a b b b
Output: NOT ACCEPTED
// n = 2 (>=1), m=3 ((3) mod3 != 1)

Input: a a a b
Output: ACCEPTED
// n = 3 (>=1), m = 1 ((1) mod 3= 1)

Input: b b b b
Output: NOT ACCEPTED
// n = 0(must be >=1), m = 4 ((4) mod 3 = 1) ```

Approaches:
It’s construction should contain the following steps:

• Step-1: Construct FA for means having any number of a’s greater than one.
• Step-2: Construct FA for means having exactly
• Step-3: Construct FA for means having b’s equal to multiple of 3 .
• Step-4: Concatenate the three FA and make single DFA. Always maintain the order of a, b and c.

• Given DFA has following states. State 2 leads to the acceptance of the string.Whereas states 0, 1, 3, 4 and 5 leads to the rejection of the string.

DFA State Transition Diagram:

Let’s see code for the demonstration:

C/C++

 `// C program to implement DFS that accepts ` `// all string which follow the language ` `// L = { a^n b^m ; n >=1, (m)mod 3=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 = 5; ` `    ``} ` ` `  `    ``// -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 = 1; ` `    ``} ` `    ``else` `if` `(c == ``'b'``) { ` `        ``dfa = 2; ` `    ``} ` `    ``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 = 5; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -1; ` `    ``} ` `} ` ` `  `// This function is for the third state (Q3)of DFA ` `void` `state3(``char` `c) ` `{ ` `    ``if` `(c == ``'b'``) { ` `        ``dfa = 4; ` `    ``} ` `    ``else` `if` `(c == ``'a'``) { ` `        ``dfa = 5; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -1; ` `    ``} ` `} ` ` `  `// This function is for the forth state (Q4)of DFA ` `void` `state4(``char` `c) ` `{ ` `    ``if` `(c == ``'b'``) { ` `        ``dfa = 2; ` `    ``} ` `    ``else` `if` `(c == ``'a'``) { ` `        ``dfa = 5; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -1; ` `    ``} ` `} ` ` `  `// This function is for the fifth state (Q5) of DFA ` `void` `state5(``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` `if` `(dfa == 5) ` `            ``state5(str[i]); ` ` `  `        ``else` `            ``return` `0; ` `    ``} ` `    ``if` `(dfa == 2) ` `        ``return` `1; ` `    ``else` `        ``return` `0; ` `} ` ` `  `// driver code ` `int` `main() ` `{ ` `    ``char` `str[] = ``"aaabbbb"``; ` `    ``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 >=1, (m)mod 3=1} ` `import` `java.util.*; ` `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 = ``5``; ` `    ``} ` `  `  `    ``// -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 = ``1``; ` `    ``} ` `    ``else` `if` `(c == ``'b'``) { ` `        ``dfa = ``2``; ` `    ``} ` `    ``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 = ``5``; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -``1``; ` `    ``} ` `} ` `  `  `// This function is for the third state (Q3)of DFA ` `static` `void` `state3(``char` `c) ` `{ ` `    ``if` `(c == ``'b'``) { ` `        ``dfa = ``4``; ` `    ``} ` `    ``else` `if` `(c == ``'a'``) { ` `        ``dfa = ``5``; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -``1``; ` `    ``} ` `} ` `  `  `// This function is for the forth state (Q4)of DFA ` `static` `void` `state4(``char` `c) ` `{ ` `    ``if` `(c == ``'b'``) { ` `        ``dfa = ``2``; ` `    ``} ` `    ``else` `if` `(c == ``'a'``) { ` `        ``dfa = ``5``; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -``1``; ` `    ``} ` `} ` `  `  `// This function is for the fifth state (Q5) of DFA ` `static` `void` `state5(``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` `if` `(dfa == ``5``) ` `            ``state5(str[i]); ` `  `  `        ``else` `            ``return` `0``; ` `    ``} ` `    ``if` `(dfa == ``2``) ` `        ``return` `1``; ` `    ``else` `        ``return` `0``; ` `} ` `  `  `// Driver code ` `public` `static` `void` `main(String[] args) { ` `   ``char` `str[] = ``"aaabbbb"``.toCharArray(); ` `    ``if` `(isAccepted(str)==``1``) ` `        ``System.out.println(``"ACCEPTED"``); ` `    ``else` `        ``System.out.println(``"NOT ACCEPTED"``); ` `    ``} ` `} ` ` `  `// This code is contributed by Rajput-Ji `

Python 3

 `# Python3 program to implement DFS that accepts    ` `# all Stringing which follow the language    ` `# L = {a ^ n b ^ m | n >= 1, (m)mod 3 = 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 ``=` `5` `         `  `    ``# -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 ``=` `1` `    ``elif` `(c ``=``=` `'b'``):   ` `        ``dfa ``=` `2` `    ``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 ``=` `5` `    ``else``:   ` `        ``dfa ``=` `-``1` `    ``return` `dfa   ` `     `  `# This function is for the third    ` `# dfa = state of DFA    ` `def` `state3(c):   ` `    ``if` `(c ``=``=` `'b'``):   ` `        ``dfa ``=` `4` `    ``elif` `(c ``=``=` `'a'``):   ` `        ``dfa ``=` `5` `    ``else``:   ` `        ``dfa ``=` `-``1` `    ``return` `dfa   ` `     `  `# This function is for the fouth    ` `# dfa = state of DFA    ` `def` `state4(c):   ` `    ``if` `(c ``=``=` `'b'``):   ` `        ``dfa ``=` `2` `    ``elif` `(c ``=``=` `'a'``):   ` `        ``dfa ``=` `5` `    ``else``:   ` `        ``dfa ``=` `-``1` `    ``return` `dfa  ` `     `  `     `  `# This function is for the fifth   ` `# dfa = state of DFA    ` `def` `state5(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])  ` `         `  `        ``elif` `(dfa ``=``=` `5``) :   ` `            ``dfa ``=` `state5(String[i]) ` `        ``else``:   ` `            ``return` `0` `    ``if``(dfa ``=``=` `2``) :   ` `        ``return` `1` `    ``else``:   ` `        ``return` `0` `     `  `# Driver code    ` `if` `__name__ ``=``=` `"__main__"` `:   ` `    ``String ``=` `"aaabbbb"` `    ``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 >=1, (m)mod 3=1} ` `using` `System; ` `public` `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 = 5; ` `    ``} ` `   `  `    ``// -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 = 1; ` `    ``} ` `    ``else` `if` `(c == ``'b'``) { ` `        ``dfa = 2; ` `    ``} ` `    ``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 = 5; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -1; ` `    ``} ` `} ` `   `  `// This function is for the third state (Q3)of DFA ` `static` `void` `state3(``char` `c) ` `{ ` `    ``if` `(c == ``'b'``) { ` `        ``dfa = 4; ` `    ``} ` `    ``else` `if` `(c == ``'a'``) { ` `        ``dfa = 5; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -1; ` `    ``} ` `} ` `   `  `// This function is for the forth state (Q4)of DFA ` `static` `void` `state4(``char` `c) ` `{ ` `    ``if` `(c == ``'b'``) { ` `        ``dfa = 2; ` `    ``} ` `    ``else` `if` `(c == ``'a'``) { ` `        ``dfa = 5; ` `    ``} ` `    ``else` `{ ` `        ``dfa = -1; ` `    ``} ` `} ` `   `  `// This function is for the fifth state (Q5) of DFA ` `static` `void` `state5(``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` `if` `(dfa == 5) ` `            ``state5(str[i]); ` `   `  `        ``else` `            ``return` `0; ` `    ``} ` `    ``if` `(dfa == 2) ` `        ``return` `1; ` `    ``else` `        ``return` `0; ` `} ` `   `  `// Driver code ` `public` `static` `void` `Main(String[] args) { ` `   ``char` `[]str = ``"aaabbbb"``.ToCharArray(); ` `    ``if` `(isAccepted(str)==1) ` `        ``Console.WriteLine(``"ACCEPTED"``); ` `    ``else` `        ``Console.WriteLine(``"NOT ACCEPTED"``); ` `    ``} ` `} ` `// This code has been contributed by 29AjayKumar `

Output:

`ACCEPTED`

My Personal Notes arrow_drop_up
Related Articles