基于DFA的单词识别问题的一种描述是:编写一个程序,输入一个确定的有穷自动机(DFA),使用该DFA识别单词。
【基本要求】设置DFA初始状态X,终态Y,过程态用数字表示:0 1 2 3………
【输入形式】标准输入
【输出形式】标准输出
【样例输入】
a b#
X Y 0 2#
X X-a->0 X-b->X
Y Y-a->0 Y-b->X
0 0-a->0 0-b->2
2 2-a->0 2-b->Y
abb#
ba#
aca#
【样例输出】
a
b
b
pass
b
a
error
a
error
可以借鉴思路,代码在测试平台会显示运行内存过大,可以运用数组来改变内存使用。具体请自己改,本人做的不够完整,望理解。
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
void SimplifyDFA(vector<string>& trans_v, vector<string>& symbol_v)
{
map<char, map<char, char>> m;
for (vector<string>::iterator it = trans_v.begin(); it != trans_v.end(); it++)
{
map<char, char> M;
int x = 1;
try
{
while (x < (int)(*it).length())
{
M.insert(pair<char, char>((*it)[x + 3], (*it)[x + 6]));//a:0\b:X
x = x + 7;
}
m.insert(pair<char, map<char, char>>((*it)[0], M));//{X:{a:0\b:X}}
}
catch (exception e)
{
}
M.clear();
}
for (vector<string>::iterator str_it = symbol_v.begin(); str_it != symbol_v.end(); str_it++)
{
char begin = 'X';
for (string::iterator char_it = (*str_it).begin(); char_it != (*str_it).end(); char_it++)
{
if ((*char_it) != '#')
{
map<char, char>::iterator iter = m[begin].find((*char_it));
if (iter != m[begin].end())
{
cout << (*char_it) << endl;
begin = iter->second;
}
else
{
cout << "error" << endl;
break;
}
}
else
{
if (begin == 'Y')
{
cout << "pass" << endl;
}
else
{
cout << "error" << endl;
}
}
}
}
}
int main()
{
string char_str;
getline(cin, char_str);
string char_state;
getline(cin, char_state);
string trans_express;
getline(cin, trans_express, '\n');
vector<string> trans_express_v;
trans_express_v.push_back(trans_express);
while (trans_express.length() > 0)
{
getline(cin, trans_express, '\n');
trans_express_v.push_back(trans_express);
}
//SimplifyDFA(trans_express_v,m);
vector<string> symbol_string_v;
string symbol_string;
getline(cin, symbol_string, '\n');
symbol_string_v.push_back(symbol_string);
while (symbol_string.length()>0)
{
getline(cin, symbol_string, '\n');
symbol_string_v.push_back(symbol_string);
}
//IdentifyWord(symbol_string_v,m);
SimplifyDFA(trans_express_v, symbol_string_v);
return 0;
}