📌  相关文章
📜  设计一个接受包含 3 个 a 和 3 个 b 的字符串的 DFA

📅  最后修改于: 2021-09-06 11:28:41             🧑  作者: Mango

问题陈述:设计一个确定的有限自动机来接受输入 {a, b} 上三个 a 和三个 b 的排列

要设计一个DFA,我们需要通过字符检查输入的字符。这些是设计 DFA 时应牢记的几个步骤。

  • 想想可以接受的所有可能的输入(例如,在本例中,aaabbb、bbbaaa、ababab、abaabb 等)。
  • 创建初始过渡状态。
  • 将每个输入字母表转换为其他转换状态。
  • 达到最终状态,使得在每个步骤中使用的语言都被接受(例如,在本例中,a 和 b 的数量相等)。

设计步骤:
步骤1 :创建一个初始状态“A”,用->表示。
第 2 步:想想可能的字符串can aaabbb 或 bbbaaa 可以通过转换发生,例如,

  • 输入“a”从状态“A”到状态“B”的转换
  • 输入’a’从状态“B”到状态“C”的转换
  • 输入’a’从状态“C”到状态“D”的转换
  • 输入’a’从状态“D”到死状态“Q2”的转换
  • 输入’b’从状态“D”到状态“E”的转换
  • 输入’b’从状态“E”到状态“F”的转换
  • 输入’b’从状态“F”到状态“G”的转换
  • 输入’b’从状态“G”到死状态“Q2”的转换

第 3 步:现在研究 b 出现在两个 a 之后的可能性,例如 aabbab、aabbab。

  • “b”从状态“C”到状态“J”的转换
  • ‘a’ 从状态“J”到状态“E”的转换
  • “b”从状态“J”到状态“M”的转换
  • ‘a’ 从状态“M”到状态“F”的转换
  • “b”从状态“M”到状态“P”的转换

转换如图所示。

第 4 步:现在考虑以 ‘aba’ 开头然后满足给定语言条件的可能性。为此,要完成以下转换:

  • “b”从状态“B”到状态“I”的转换
  • ‘a’ 从状态“I”到状态“J”的转换

步骤 5:现在考虑以 ‘abb’ 开头然后满足给定语言条件的可能性。为此,要完成以下转换:

  • ‘b’ 从状态“I”到状态“L”的转换
  • ‘a’ 从状态“L”到状态“M”的转换

第 6 步:现在有可能在读取一个 ‘a’ 后它读取所有 3 个 b,然后通过读取剩余的 2 个 a 来结束执行。用于“b”从状态“L”到“O”的转换。

步骤 7:它有可能在读取一个 ‘b’ 后读取 ‘a’,然后读取 ‘a’ 和 ‘b’ 的任意组合,因此该字符串包含 3 个 a 和 3 个 b。对于 ‘a 的这种转换’从状态“H”到状态“I”完成。

步骤8:现在,想想有两个B的字符串开始和旅途中的字符串的任意组合来获取此我们做“一”从盯“K”国家“L”的转变所需的结果。

步骤 9:现在输入状态 D、E、F、G 的字母“a”,状态 G、N、O、P 的“b”留给转换。因为我们已经完成了上述语言的所有可能性,所以剩余的转换将进入死状态“Q1”和Q2。

  • 输入’a’从状态“D”到死状态“Q1”的转换
  • 输入’a’从状态“E”到死状态“Q1”的转换
  • 输入’a’从状态“F”到死状态“Q1”的转换
  • 输入’a’从状态“G”到死状态“Q1”的转换
  • 输入’b’从状态“G”到死状态“Q2”的转换
  • 输入’b’从状态“N”到死状态“Q2”的转换
  • 输入’b’从状态“O”到死状态“Q2”的转换
  • 输入’b’从状态“P”到死状态“Q2”的转换

以上DFA的转换表

STATES INPUT (a) INPUT (b)
—> A (initial state) B H
B C I
C D J
D Q2 (dead state) E
E Q2 (dead state) F
F Q2 (dead state) G*(final state)
G* (final state) Q2 (dead state) Q1 (dead state)
H I K
I J L
J E M
K L N
L M O
M F P
N O Q1 (dead state)
O P Q1 (dead state)
P G* (final state) Q1 (dead state)

下面是 DFA 的实现:

Java
// Java implementation of the
// DFA of permutation of three
// a's and three b's
import java.util.*;
 
class GFG{
   
// State A
static void stateA(String n)
{
  if (n.charAt(0) == 'a')
    stateB(n.substring(1));
  else if (n.charAt(0) == 'b')
  {
    stateH(n.substring(1));
  }
 }
   
// State B
static void stateB(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {   
    if (n.charAt(0) == 'a')
      stateC(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateI(n.substring(1));
  }
}
    
// State C
static void stateC(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {
    if (n.charAt(0) == 'a')
      stateD(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateJ(n.substring(1));
  }
}
    
// State D
static void stateD(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else  
  {
    if (n.charAt(0) == 'a')
      stateQ2(n);
    else if (n.charAt(0) == 'b')
      stateE(n.substring(1));
  }
}   
       
// State E
static void stateE(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {   
    if (n.charAt(0) == 'a')
      stateQ2(n);
    else if (n.charAt(0) == 'b')
      stateF(n.substring(1));
  }
}   
    
// State F
static void stateF(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {  
    if (n.charAt(0) == 'a')
      stateQ2(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateG(n.substring(1)); 
  }
} 
    
// State G
static void stateG(String n)
{
  if (n.length() == 0)
    System.out.print("String Accepted");
  else
  {   
    if (n.charAt(0) == 'a')
      stateQ2(n);
    else if (n.charAt(0) == 'b')
      stateQ2(n); 
  }
}
    
// State H
static void stateH(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {   
    if (n.charAt(0) == 'a')
      stateI(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateK(n.substring(1));
  }
} 
    
// State I
static void stateI(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {   
    if (n.charAt(0) == 'a')
      stateJ(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateL(n.substring(1));
  }
}
   
// State J
static void stateJ(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {
    if (n.charAt(0) == 'a')
      stateE(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateM(n.substring(1));        
  }
}
               
// State K
static void stateK(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else  
  {
    if (n.charAt(0) == 'a')
      stateL(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateN(n.substring(1)); 
  }
}
              
// State L
static void stateL(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {  
    if (n.charAt(0) == 'a')
      stateM(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateO(n.substring(1)); 
  }
}
  
// State M
static void stateM(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {
    if (n.charAt(0) == 'a')
      stateF(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateP(n.substring(1));           
  }
}
  
// State N
static void stateN(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else  
    if (n.charAt(0) =='a')
      stateO(n.substring(1));
  else if (n.charAt(0) == 'b')
    stateQ1(n);
}
  
// State Q
static void stateO(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {   
    if (n.charAt(0) == 'a')
      stateP(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateQ1(n);
  }
}
           
// State P
static void stateP(String n)
{
  if (n.length() == 0)
    System.out.print("String Not Accepted");
  else
  {
    if (n.charAt(0) == 'a')
      stateG(n.substring(1));
    else if (n.charAt(0) == 'b')
      stateQ1(n.substring(1));    
  }
}
               
// State Q1
static void stateQ1(String n)
{
  System.out.print("String Not Accepted");
}
   
// State Q2
static void stateQ2(String n)
{
  System.out.print("String Not Accepted");
}
       
// Driver code
public static void main(String[] args)
{
   
  // Take String input
  String n = "abaabb";
  
  // Call stateA
  // to check the input
  stateA(n);
}
}
 
// This code is contributed by pratham76


Python3
# Python3 implementation of the
# DFA of permutation of three
# a's and three b's
 
# State A
def stateA(n):
    if(n[0]=='a'):
        stateB(n[1:])
    elif (n[0]=='b'):
        stateH(n[1:])
 
# State B
def stateB(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateC(n[1:])
        elif (n[0]=='b'):
            stateI(n[1:])
 
# State C
def stateC(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateD(n[1:])
        elif (n[0]=='b'):
            stateJ(n[1:])
 
# State D
def stateD(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateQ2(n)
        elif (n[0]=='b'):
            stateE(n[1:])
         
# State E
def stateE(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateQ2(n)
        elif (n[0]=='b'):
            stateF(n[1:])  
     
# State F
def stateF(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateQ2(n[1:])
        elif (n[0]=='b'):
            stateG(n[1:])    
            
# State G
def stateG(n):
    if(len(n)== 0):
        print("String Accepted")
    else:   
        if(n[0]=='a'):
            stateQ2(n)
        elif (n[0]=='b'):
            stateQ2(n) 
             
# State H
def stateH(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateI(n[1:])
        elif (n[0]=='b'):
            stateK(n[1:])
            
# State I
def stateI(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateJ(n[1:])
        elif (n[0]=='b'):
            stateL(n[1:])
 
# State J
def stateJ(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateE(n[1:])
        elif (n[0]=='b'):
            stateM(n[1:])        
             
# State K
def stateK(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateL(n[1:])
        elif (n[0]=='b'):
            stateN(n[1:]) 
             
# State L
def stateL(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateM(n[1:])
        elif (n[0]=='b'):
            stateO(n[1:])  
             
# State M
def stateM(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateF(n[1:])
        elif (n[0]=='b'):
            stateP(n[1:])           
 
# State N
def stateN(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateO(n[1:])
        elif (n[0]=='b'):
            stateQ1(n)
             
# State Q
def stateO(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateP(n[1:])
        elif (n[0]=='b'):
            stateQ1(n)
             
# State P
def stateP(n):
    if(len(n)== 0):
        print("String Not Accepted")
    else:   
        if(n[0]=='a'):
            stateG(n[1:])
        elif (n[0]=='b'):
            stateQ1(n[1:])    
             
# State Q1
def stateQ1(n):
    print("String Not Accepted")
 
# State Q2
def stateQ2(n):
    print("String Not Accepted")
 
# take string input
n = "abaabb"
 
# call stateA
# to check the input
stateA(n)


C#
// C# implementation of the
// DFA of permutation of three
// a's and three b's
using System;
using System.Collections;
class GFG{
  
// State A
static void stateA(string n)
{
  if(n[0] == 'a')
    stateB(n.Substring(1));
  else if (n[0] == 'b')
  {
    stateH(n.Substring(1));
  }
 }
  
// State B
static void stateB(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {   
    if(n[0] == 'a')
      stateC(n.Substring(1));
    else if (n[0] == 'b')
      stateI(n.Substring(1));
  }
}
   
// State C
static void stateC(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {
    if(n[0] == 'a')
      stateD(n.Substring(1));
    else if (n[0] == 'b')
      stateJ(n.Substring(1));
  }
}
   
// State D
static void stateD(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else   
  {
    if(n[0] == 'a')
      stateQ2(n);
    else if (n[0] == 'b')
      stateE(n.Substring(1));
  }
}   
      
// State E
static void stateE(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {   
    if(n[0] == 'a')
      stateQ2(n);
    else if (n[0] == 'b')
      stateF(n.Substring(1));
  }
}   
   
// State F
static void stateF(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {  
    if(n[0] == 'a')
      stateQ2(n.Substring(1));
    else if (n[0] == 'b')
      stateG(n.Substring(1)); 
  }
} 
   
// State G
static void stateG(string n)
{
  if(n.Length == 0)
    Console.Write("String Accepted");
  else
  {   
    if(n[0] == 'a')
      stateQ2(n);
    else if (n[0] == 'b')
      stateQ2(n); 
  }
}
   
// State H
static void stateH(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {   
    if(n[0] == 'a')
      stateI(n.Substring(1));
    else if (n[0] == 'b')
      stateK(n.Substring(1));
  }
} 
   
// State I
static void stateI(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {   
    if(n[0] == 'a')
      stateJ(n.Substring(1));
    else if (n[0] == 'b')
      stateL(n.Substring(1));
  }
}
  
// State J
static void stateJ(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {
    if(n[0] == 'a')
      stateE(n.Substring(1));
    else if (n[0] == 'b')
      stateM(n.Substring(1));        
  }
}
              
// State K
static void stateK(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else   
  {
    if(n[0] == 'a')
      stateL(n.Substring(1));
    else if (n[0] == 'b')
      stateN(n.Substring(1)); 
  }
}
             
// State L
static void stateL(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {  
    if(n[0] == 'a')
      stateM(n.Substring(1));
    else if (n[0] == 'b')
      stateO(n.Substring(1)); 
  }
}
 
// State M
static void stateM(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else{
    if(n[0] == 'a')
      stateF(n.Substring(1));
    else if (n[0] == 'b')
      stateP(n.Substring(1));           
  }
}
 
// State N
static void stateN(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else   
    if(n[0] =='a')
      stateO(n.Substring(1));
  else if (n[0] == 'b')
    stateQ1(n);
}
 
// State Q
static void stateO(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {   
    if(n[0] == 'a')
      stateP(n.Substring(1));
    else if(n[0] == 'b')
      stateQ1(n);
  }
}
          
// State P
static void stateP(string n)
{
  if(n.Length == 0)
    Console.Write("String Not Accepted");
  else
  {
    if(n[0] == 'a')
      stateG(n.Substring(1));
    else if (n[0] == 'b')
      stateQ1(n.Substring(1));    
  }
}
              
// State Q1
static void stateQ1(string n)
{
  Console.Write("String Not Accepted");
}
  
// State Q2
static void stateQ2(string n)
{
  Console.Write("String Not Accepted");
}
      
// Driver code
public static void Main (string[] args)
{
  // Take string input
  string n = "abaabb";
 
  // Call stateA
  // to check the input
  stateA(n);
}
}
 
// This code is contributed by rutvik_56


Javascript


输出:
String Accepted

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live