DFA 接受包含“aba”作为子字符串的所有字符串 w ∈(a,b)* 的 C 程序
问题
设计一个用于语言 L={w1abaw2 | w1,w2 Є(a,b)*} 的 DFA,这意味着 DFA 接受所有包含“aba”作为子字符串的字符串。
解决方案
语言 L= {aba,aabaa, aabab, babab, ababa, …….} 接受的字符串。
步骤 1 - 最小字符串(起始字符串)的转换图 -

如果 w1 和 w2 为空,则生成的字符串为“aba”,因为 w1、w2 ε(a,b)*
q0 是初始状态,q3 是最终状态。
步骤 2 - 给定语言的最终 DFA 如下所示 -

解释
qo 是初始状态,q0 在 'a' 上转到 q1,在 'b' 上转到 q0,根据 DFA,每个状态都必须对两个输入生成一个转换。
q1 在 'a' 上转到 q1,在 'b' 上转到 q2,我们必须牢记根据给定的语言,我们需要生成一个子字符串“aba”。
q2 在 'a' 上转到 q3,在 'b' 上转到 q0 状态。
q3 是最终状态,在输入 'a' 和 'b' 上都只转到 q3。
转换表
让我们看看如下所示的转换表 -
| 当前状态 | 输入 a | 输入 b |
|---|---|---|
| q0 | q1 | q0 |
| q1 | q1 | q2 |
| q2 | q3 | q0 |
| *q3 | q3 | q3 |
示例
以下是构建 DFA 的 C 程序,该 DFA 接受所有包含“aba”作为子字符串的字符串 w ε(a,b)* -
#include <stdio.h>
#include <string.h>
void checkDFA(char s[] ) {
// storing initial state
int initialState = 0;
//assign initial state to previous state.
int previousState = initialState;
int finalState;
for(int i = 0; i < strlen(s); i++) {
if((previousState == 0 && s[i] == 'a') || (previousState == 1 && s[i] == 'a')) {
finalState = 1;
}
if((previousState == 0 && s[i] == 'b') || (previousState == 2 && s[i] == 'b')) {
finalState = 0;
}
if(previousState == 1 && s[i] == 'b') {
finalState = 2;
}
if((previousState == 2 && s[i] == 'a') || (previousState == 3)) {
finalState = 3;
}
previousState = finalState;
}
if(finalState == 3) {
printf("given string is Accepted");
}
else
{
printf("given string is Not Accepted");
}
}
int main() {
// Given string
char s[40];
printf("implementation of DFA which having a sub string 'aba':
enter a string:");
scanf("%s",s);
checkDFA(s);
return 0;
}输出
输出如下所示 -
Run 1: implementation of DFA which having a sub string 'aba': enter a string:aba given string is Accepted. Run 2: implementation of DFA which having a sub string 'aba': enter a string:abba given string is Not Accepted.
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP