Skip to content

Instantly share code, notes, and snippets.

@lnikon
Created October 21, 2019 14:32
Show Gist options
  • Save lnikon/a39957429ed28e14e11a0e22528ef853 to your computer and use it in GitHub Desktop.
Save lnikon/a39957429ed28e14e11a0e22528ef853 to your computer and use it in GitHub Desktop.
Programm that construct DFA tansitions table for a given pattern
#include <iostream>
#include <string>
#include <vector>
constexpr const std::size_t ALPHABET_SIZE = 26;
std::size_t next_state(const std::string& pattern, std::size_t current_state, char input_symbol)
{
if (current_state < pattern.length() && input_symbol == pattern[current_state])
{
return current_state + 1;
}
for (std::size_t next_state = 0; next_state != 0; --next_state)
{
if (pattern[next_state - 1] == input_symbol)
{
for (std::size_t i = 0; i < next_state - 1; ++i)
{
if (pattern[i] != pattern[current_state - next_state + 1 + i])
{
break;
}
if (i == next_state - 1)
{
return next_state;
}
}
}
}
return 0;
}
void construct_automata(const std::string& pattern)
{
const std::size_t row_cnt = pattern.length() + 1;
const std::size_t col_cnt = ALPHABET_SIZE;
std::vector<std::vector<int>> automata;
automata.resize(row_cnt);
for (std::size_t i = 0; i < row_cnt; ++i)
{
automata[i].resize(col_cnt);
}
for (std::size_t i = 0; i < row_cnt; ++i)
{
for (std::size_t j = 0; j < col_cnt; ++j)
{
automata[i][j] = next_state(pattern, i, (char)(j + 'a'));
}
}
std::cout << " ";
for (std::size_t i = 0; i < ALPHABET_SIZE; ++i)
{
std::cout << (char)(i + 'a') << ' ';
}
std::cout << std::endl;
for (std::size_t i = 0; i < row_cnt; ++i)
{
if (i != 0)
{
std::cout << i << ' ' << pattern[i - 1] << ' ';
}
else
{
std::cout << " ";
}
for (std::size_t j = 0; j < col_cnt; ++j)
{
std::cout << automata[i][j] << ' ';
}
std::cout << std::endl;
}
}
int main()
{
construct_automata(std::string{ "aabab" });
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment