先决条件——有限自动机简介
问题:为不包含连续两个 a 且以 a 开头的字符串构造确定性有限自动机 (DFA)。
解释:
接受不包含连续两个 a 的字符串。检查给定的字符串包含连续的两个 a。 (bz) 的任何出现都不应影响场景。字符串应遵循以下模式:
a.(ww|(ww.a))*
where, ww = all possible character except a
不接受所有不属于上述模式的字符串。
不包含连续两个 a 的字符串的确定性有限自动机 (DFA),如下所示。这个 dfa 中的初始和起始状态是 q0。
使用的方法:
在这个程序中,考虑 6 个状态是 0、1、2、3、4 和 5。现在让我们取一个名为 DFA 的变量,它最初为 0。每当发生任何转换时,它都会更新 DFA 的值与新状态相关联的数字。
例子:
如果发生从状态 0 到状态 1 的转换,则 DFA 的值将更新为 1。如果发生从状态 2 到状态 3 的转换,则 dfa 的值将更新为 3。这样,将此算法应用于整个字符串,如果最后到达状态 1、2、4 或 5,则我们的字符串将被接受,否则将不被接受。
Input : geeksaforaageeks
Output : NOT ACCEPTED
Input : aageeksforageeks
Output : NOT ACCEPTED
Input : ageeksaforageeks
Output : ACCEPTED
执行:
C++
// C++ program to implement DFA for Strings
// not containing consecutive two a's
#include
using namespace std;
int dfa = 0;
// This function is for
// the starting state of DFA
void start(char c)
{
if (c == 'a')
{
dfa = 1;
}
else
{
dfa = 3;
}
}
// This function is for the first state of DFA
void state1(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 4;
}
}
// This function is for the second state of DFA
void state2(char c)
{
if (c == 'a')
{
dfa = 5;
}
else
{
dfa = 2;
}
}
// This function is for the third state of DFA
void state3(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 3;
}
}
// This function is for the forth state of DFA
void state4(char c)
{
if (c == 'a')
{
dfa = 5;
}
else
{
dfa = 2;
}
}
void state5(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 2;
}
}
int isAccepted(char str[])
{
// Store length of string
int i, len = strlen(str);
for(i = 0; i < len; i++)
{
// cout<<"%d", dfa);
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 == 0)
return 0;
else if (dfa == 3)
return 0;
else
return 1;
}
// Driver code
int main()
{
char str[] = "ageeksaforageeks";
if (isAccepted(str))
cout << "ACCEPTED";
else
cout << "NOT ACCEPTED";
return 0;
}
// This code is contributed by shivanisinghss2110.
C
// C program to implement DFA for Strings
// not containing consecutive two a's
#include
#include
int dfa = 0;
// This function is for
// the starting state of DFA
void start(char c)
{
if (c == 'a') {
dfa = 1;
}
else {
dfa = 3;
}
}
// This function is for the first state of DFA
void state1(char c)
{
if (c == 'a') {
dfa = 3;
}
else {
dfa = 4;
}
}
// This function is for the second state of DFA
void state2(char c)
{
if (c == 'a') {
dfa = 5;
}
else {
dfa = 2;
}
}
// This function is for the third state of DFA
void state3(char c)
{
if (c == 'a') {
dfa = 3;
}
else {
dfa = 3;
}
}
// This function is for the forth state of DFA
void state4(char c)
{
if (c == 'a') {
dfa = 5;
}
else {
dfa = 2;
}
}
void state5(char c)
{
if (c == 'a') {
dfa = 3;
}
else {
dfa = 2;
}
}
int isAccepted(char str[])
{
// store length of string
int i, len = strlen(str);
for (i = 0; i < len; i++) {
// printf("%d", dfa);
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 == 0)
return 0;
else if (dfa == 3)
return 0;
else
return 1;
}
// driver code
int main()
{
char str[] = "ageeksaforageeks";
if (isAccepted(str))
printf("ACCEPTED");
else
printf("NOT ACCEPTED");
return 0;
}
// This code is contributed by SHUBHAMSINGH10.
Java
// Java program to implement DFA for Strings
// not containing consecutive two a's
import java.util.*;
class GFG
{
static int dfa = 0;
// This function is for
// the starting state of DFA
static void start(char c)
{
if (c == 'a')
{
dfa = 1;
}
else
{
dfa = 3;
}
}
// This function is for the first state of DFA
static void state1(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 4;
}
}
// This function is for the second state of DFA
static void state2(char c)
{
if (c == 'a')
{
dfa = 5;
}
else
{
dfa = 2;
}
}
// This function is for the third state of DFA
static void state3(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 3;
}
}
// This function is for the forth state of DFA
static void state4(char c)
{
if (c == 'a')
{
dfa = 5;
}
else
{
dfa = 2;
}
}
static void state5(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 2;
}
}
static int isAccepted(char str[])
{
// store length of string
int i, len = str.length;
for (i = 0; i < len; i++)
{
// System.out.printf("%d", dfa);
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 == 0)
return 0;
else if (dfa == 3)
return 0;
else
return 1;
}
// Driver code
public static void main(String args[])
{
char str[] = "ageeksaforageeks".toCharArray();
if (isAccepted(str) == 1)
System.out.printf("ACCEPTED");
else
System.out.printf("NOT ACCEPTED");
}
}
// This code is contributed by Arnab Kundu
Python3
# Python3 program to implement DFA for Strings
# not containing consecutive two a's
# This function is for the dfa = starting
# dfa = state (zeroth) of DFA
def start(c):
if (c == 'a'):
dfa = 1
else:
dfa = 3
return dfa
# This function is for the first
# dfa = state of DFA
def state1(c):
if (c == 'a'):
dfa = 3
else:
dfa = 4
return dfa
# This function is for the second
# dfa = state of DFA
def state2(c):
if (c == 'a'):
dfa = 5
else:
dfa = 2
return dfa
# This function is for the third
# dfa = state of DFA
def state3(c):
if (c == 'a'):
dfa = 3
else:
dfa = 3
return dfa
# This function is for the fouth
# dfa = state of DFA
def state4(c):
if (c == 'a'):
dfa = 5
else:
dfa = 2
return dfa
# This function is for the fifth
# dfa = state of DFA
def state5(c):
if (c == 'a'):
dfa = 3
else:
dfa = 2
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 == 3 or dfa == 0) :
return 0
else:
return 1
# Driver code
if __name__ == "__main__" :
String = "ageeksaforageeks"
if (isAccepted(String)) :
print("ACCEPTED")
else:
print("NOT ACCEPTED")
# This code is contributed by SHUBHAMSINGH10.
C#
// C# program to implement DFA for Strings
// not containing consecutive two a's
using System;
public class GFG
{
static int dfa = 0;
// This function is for
// the starting state of DFA
static void start(char c)
{
if (c == 'a')
{
dfa = 1;
}
else
{
dfa = 3;
}
}
// This function is for the first state of DFA
static void state1(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 4;
}
}
// This function is for the second state of DFA
static void state2(char c)
{
if (c == 'a')
{
dfa = 5;
}
else
{
dfa = 2;
}
}
// This function is for the third state of DFA
static void state3(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 3;
}
}
// This function is for the forth state of DFA
static void state4(char c)
{
if (c == 'a')
{
dfa = 5;
}
else
{
dfa = 2;
}
}
static void state5(char c)
{
if (c == 'a')
{
dfa = 3;
}
else
{
dfa = 2;
}
}
static int isAccepted(char[] str)
{
// store length of string
int i, len = str.Length;
for (i = 0; i < len; i++)
{
// System.out.printf("%d", dfa);
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 == 0)
return 0;
else if (dfa == 3)
return 0;
else
return 1;
}
// Driver code
public static void Main(String []args)
{
char []str = "ageeksaforageeks".ToCharArray();
if (isAccepted(str) == 1)
Console.WriteLine("ACCEPTED");
else
Console.WriteLine("NOT ACCEPTED");
}
}
/* This code contributed by PrinciRaj1992 */
Javascript
输出:
ACCEPTED
这个程序的时间复杂度是 O(n)