先决条件:确定性有限自动机简介
构造一个DFA,该DFA接受以输入字母‘a’开头的字符串str ,但不包含‘aab’作为输入{a,b}的子字符串。
例子:
Input: str = “babba”
Output: Not Accepted
Explanation:
The given string doesn’t start with ‘a’.
Input: str = “abbaaaaa”
Output: Accepted
Explanation:
The given string start with ‘a’and doesn’t contains “aab” as a substring.
方法:
转换表有助于了解每个状态如何在输入字母上发生。在转换表中,初始状态由->表示,最终状态由*表示。共有3种最终状态,一种是初始状态,一种是死亡状态。
给定DFA的状态转换表:
STATE | INPUT (a) | INPUT (b) |
---|---|---|
—> A | B* | Q (dead state) |
B* | C* | D* |
C* | C* | Q (dead state) |
D* | B* | D* |
Q (dead state) | Q (dead state) | Q (dead State) |
以下是DFA图:
以下是上述DFA的实现:
C++
// C++ code for the above DFA
#include
using namespace std;
void stateQ(string);
void stateA(string);
void stateB(string);
void stateC(string);
void stateD(string);
// Function for state Q
// transition
void stateQ(string n)
{
// In dead state
// it shows string
// not accepted
cout << ("Not Accepted");
}
// Function for state A
// transition
void stateA(string n)
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n[0] == 'a')
stateB(n.substr(
1, n.length() + 1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
// Function for state B transition
void stateB(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.length() == 0)
cout << ("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
stateC(n.substr(
1, n.length() - 1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.substr(
1, n.length() - 1));
}
}
// Function for state C
// transition
void stateC(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.length() == 0)
cout << ("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
stateC(n.substr(
1, n.length() + 1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
}
// Function for state D
// transition
void stateD(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.length() == 0)
cout << ("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n[0] == 'a')
stateB(n.substr(
1, n.length() + 1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.substr(
1, n.length() + 1));
}
}
// Driver code
int main()
{
// Take string input
string n = "aaaba";
// Call stateA to check
// the input
stateA(n);
}
// This code is contributed by Chitranayal
Java
// Java code for the
// above DFA
import java.util.*;
class GFG{
// Function for state
// A transition
static void stateA(String n)
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n.charAt(0) == 'a')
{
stateB(n.substring(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateQ(n);
}
}
// Function for transition
// state B
static void stateB(String n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length() == 0)
{
System.out.print("Accepted");
}
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n.charAt(0) == 'a')
stateC(n.substring(1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.substring(1));
}
}
// Function for transition
// state C
static void stateC(String n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length() == 0)
System.out.print("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n.charAt(0) == 'a')
stateC(n.substring(1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
}
// Function for transition
// state D
static void stateD(String n)
{
// length() of String
// become 0 then
// print Accepted
if (n.length() == 0)
System.out.print("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n.charAt(0) == 'a')
{
stateB(n.substring(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateD(n.substring(1));
}
}
}
// Function for state Q
// transition
static void stateQ(String n)
{
// In dead state
// it shows String
// not accepted
System.out.print("Not Accepted");
}
// Driver code
public static void main(String []args)
{
// Take String input
String n ="aaaba";
// Call stateA to check the input
stateA(n);
}
}
// This code is contributed by pratham76
Python3
# Python3 code for the above DFA
# Function for state A transition
def stateA(n):
# If at index 0
# 'a' if found then
# call stateB function
# with passing n[1:] to it
if (n[0]=='a'):
stateB(n[1:])
# If at index 0
# 'b' if found then
# call stateQ function
# with passing n to it
else:
stateQ(n)
# Function for state B transition
def stateB(n):
# Length of string
# become 0 then
# print Accepted
if(len(n)== 0):
print("Accepted")
else:
# If at index 0
# 'a' if found then
# call stateC function
# with passing n[1:] to it
if (n[0]=='a'):
stateC(n[1:])
# If at index 0
# 'b' if found then
# call stateD function
# with passing n[1:] to it
else:
stateD(n[1:])
# Function for state C transition
def stateC(n):
# Length of string
# become 0 then
# print Accepted
if(len(n)== 0):
print("Accepted")
else:
# If at index 0
# 'a' if found then
# call stateC function
# with passing n[1:] to it
if (n[0]=='a'):
stateC(n[1:])
# If at index 0
# 'b' if found then
# call stateQ function
# with passing n to it
else:
stateQ(n)
# Function for state D transition
def stateD(n):
# Length of string
# become 0 then
# print Accepted
if(len(n)== 0):
print("Accepted")
else:
# If at index 0
# 'a' if found then
# call stateB function
# with passing n[1:] to it
if (n[0]=='a'):
stateB(n[1:])
# If at index 0
# 'b' if found then
# call stateD function
# with passing n[1:] to it
else:
stateD(n[1:])
# Function for state Q transition
def stateQ(n):
# In dead state
# it shows string
# not accepted
print("Not Accepted")
# Take string input
n ="aaaba"
# Call stateA to check the input
stateA(n)
C#
// C# code for the
// above DFA
using System;
using System.Collections;
using System.Collections.Generic;
class GFG{
// Function for state
// A transition
static void stateA(string n)
{
// If at index 0
// 'a' if found then
// call stateB function
// with passing n[1:] to it
if (n[0] == 'a')
{
stateB(n.Substring(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateQ(n);
}
}
// Function for transition
// state B
static void stateB(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.Length == 0)
{
Console.Write("Accepted");
}
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if(n[0] == 'a')
stateC(n.Substring(1));
// If at index 0
// 'b' if found then
// call stateD function
// with passing n[1:] to it
else
stateD(n.Substring(1));
}
}
// Function for transition
// state C
static void stateC(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.Length == 0)
Console.Write("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
stateC(n.Substring(1));
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
stateQ(n);
}
}
// Function for transition
// state D
static void stateD(string n)
{
// Length of string
// become 0 then
// print Accepted
if (n.Length == 0)
Console.Write("Accepted");
else
{
// If at index 0
// 'a' if found then
// call stateC function
// with passing n[1:] to it
if (n[0] == 'a')
{
stateB(n.Substring(1));
}
// If at index 0
// 'b' if found then
// call stateQ function
// with passing n to it
else
{
stateD(n.Substring(1));
}
}
}
// Function for state Q
// transition
static void stateQ(string n)
{
// In dead state
// it shows string
// not accepted
Console.Write("Not Accepted");
}
// Driver code
public static void Main(string []args)
{
// Take string input
string n ="aaaba";
// Call stateA to check the input
stateA(n);
}
}
// This code is contributed by rutvik_56
输出:
Not Accepted