Aleks11

iswm

Jan 28th, 2014
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <Windows.h>
  4.  
  5. #include <string>
  6. #include <locale>
  7.  
  8. #include <vector>
  9. #include <algorithm>
  10. #include <cctype>
  11.  
  12.  
  13. bool iswm(std::string const &_sMask, std::string const &_Text)
  14. {
  15.     std::string sMask;
  16.  
  17.     {
  18.         char cLast = 0;
  19.         size_t iLast = 0;
  20.  
  21.         for (size_t i = 0; i < _sMask.size(); i++)
  22.         {
  23.             char c = _sMask[i];
  24.             if (!(cLast == c && c == '*' || !isgraph(c)))
  25.             {
  26.                 sMask.push_back(_sMask[i]);
  27.                 iLast++;
  28.             }
  29.  
  30.             cLast = c;
  31.         }
  32.     }
  33.  
  34.     // Функция возвращает состояния из какого-то состояния
  35.     // вход - символ на вход, состояние
  36.     // выход - состояния
  37.     auto _GetStates = [&sMask](size_t _State, char _cInput)
  38.     {
  39.         std::vector<size_t> States;
  40.  
  41.         // если текущий переход - ?, то засовываем и идём дальше
  42.         // или если текущий переход == входному символу - переходим дальше
  43.         if (sMask[_State + 1] == '?' || sMask[_State + 1] == _cInput)
  44.         {
  45.             States.push_back(_State + 1);
  46.         }
  47.  
  48.         // если текущий переход *, то остаёмся тут и всё
  49.         if (_State != -1 && sMask[_State] == '*')
  50.         {
  51.             States.push_back(_State);
  52.         }
  53.  
  54.         if (sMask[_State + 1] == '*')
  55.         {
  56.             States.push_back(_State + 1);
  57.  
  58.             // * = 0
  59.             if (_State + 2 < sMask.size() && (sMask[_State + 2] == '?' || sMask[_State + 2] == _cInput))
  60.             {
  61.                 States.push_back(_State + 2);
  62.             }
  63.         }
  64.  
  65.         return States;
  66.     };
  67.  
  68.     // вектор состояний, хранятся позиции состояния(т.е. символа)
  69.     std::vector<size_t> States(1, -1);
  70.  
  71.     // идём чётко по тексту
  72.     for (char cSource : _Text)
  73.     {
  74.         // быстрый выход по несоответствию
  75.         if (States.empty())
  76.             break;
  77.  
  78.         std::vector<size_t> NewStates;
  79.  
  80.         // но по маске не идём, проход по маске представляет НКА!
  81.         for (size_t iPos : States)
  82.         {
  83.             auto states = _GetStates(iPos, cSource);
  84.             NewStates.insert(NewStates.end(), states.begin(), states.end());
  85.         }
  86.  
  87.         States.assign(NewStates.begin(), NewStates.end());
  88.     }
  89.  
  90.  
  91.     // допускающее - последнее ) естессно
  92.     for (size_t i : States)
  93.     {
  94.         if (i == sMask.size() - 1)
  95.         {
  96.             return true;
  97.         }
  98.     }
  99.  
  100.     return false;
  101. }
  102.  
  103. int main()
  104. {
  105.     std::string sMask = "a?*b*c";
  106.     std::string sText = "apbdsadasc";
  107.  
  108.     printf("\"%s\" by mask \"%s\": %d\n", sText.c_str(), sMask.c_str(), iswm(sMask, sText));
  109.  
  110.     _getch();
  111.     return 0;
  112. };
Advertisement
Add Comment
Please, Sign In to add comment