Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- enum typesOfChars {b_d, d_2_7, d_ACDEF, b_end_aka_B, h_end, o_end, d_89} tpOfCh;
- const int tran[6][7] = {
- {2, 3, 0, 0, 0, 0, 5},
- {2, 3, 5, 4, 6, 6, 5},
- {3, 3, 5, 5, 6, 6, 5},
- {5, 5, 5, 5, 6, 0, 5},
- {5, 5, 5, 5, 6, 0, 5},
- {0, 0, 0, 0, 0, 0, 0}};
- const bool isFinalState[] = {false, false, false, true, false, true};
- int getCharType(char ch)
- {
- if (ch == '0' || ch == '1') {
- return b_d;
- }
- if (ch >= '2' && ch <= '7') {
- return d_2_7;
- }
- if (ch == 'B') {
- return b_end_aka_B;
- }
- if (ch >= 'A' && ch <= 'F') {
- return d_ACDEF;
- }
- if (ch == 'o') {
- return o_end;
- }
- if (ch == 'H' || ch == 'h') {
- return h_end;
- }
- if (ch == '8' || ch == '9') {
- return d_89;
- }
- return -1;
- }
- int checkTheString(std::string strIn)
- {
- bool loopShouldGo = true;
- int lastIndexFromAcceptedString = -1;
- int state = 1;
- int chType;
- for (int i = 0; i < strIn.length(); i++) {
- char ch = strIn[i];
- chType = getCharType(ch);
- if (chType == -1) {
- loopShouldGo = false;
- break;
- }
- state = tran[state - 1][chType];
- if (state == 0) {
- loopShouldGo = false;
- break;
- }
- if (isFinalState[state - 1]) {
- lastIndexFromAcceptedString = i;
- }
- }
- return lastIndexFromAcceptedString;
- }
- void findAllSubstrings(std::string strIn)
- {
- int quantOfApproved = 0;
- std::string subStr;
- for (int i = 0; i < strIn.length(); i++) {
- subStr = strIn.substr(i, (int)strIn.length() - i);
- int lastIndexFromAcceptedString = checkTheString(subStr);
- if (lastIndexFromAcceptedString > -1) {
- if (quantOfApproved == 0) {
- std::cout << "Одобренные подстроки:\n";
- }
- quantOfApproved++;
- std::cout << subStr.substr(0, lastIndexFromAcceptedString + 1) << "\n";
- strIn.erase(i, lastIndexFromAcceptedString + 1);
- i--;
- }
- }
- if (quantOfApproved == 0) {
- std::cout << "Одобренных подстрок нет\n";
- } else {
- std::cout << "Одобренных подстрок " << quantOfApproved << " штук.\n";
- }
- }
- int main(int argc, const char * argv[]) {
- std::string strIn;
- std::cout << "Введите строку для проверки:\n";
- getline(std::cin, strIn);
- findAllSubstrings(strIn);
- std::cout << "\nПрограмма завершена.\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment