字符串匹配算法-有限状态机

    下面是字符串匹配算法-有限状态机的简单实现。

     //产生字符串P的有限机, void X(const string P, int (*prefix)[26]) { int m = P.length(); for(int q = -1; q < m; q++) { for(int j = 0; j < 26; j++) { int k = m < q + 1? (m): (q + 1); bool IsMax = false; string temp; if(k > 0) temp.assign(P, 0, q + 1); temp = temp + char(j + 97); //cout << temp << endl; while(k >= 0) { for(int d = k, i = q + 1; d >= 0 && i >= 0; d--, i--) { if(P[d] != temp[i]) break; if(0 == d) IsMax = true; } if(true == IsMax) break; k = k - 1; } prefix[q + 1][j] = k + 1; } } } //判读P是否是T的子串,利用有限机机制 void match(string T, string P) { int n = T.length(); int prefix[P.length() + 1][26]; X(P, prefix); int q = 0; for(int i = 0; i < n; i++) { int j = T[i] - 97; q = prefix[q][j]; if(q == P.length()) { cout << "yes" << endl; return; } } }

下面是判读P是否是T的子串,其中P字符串中可以包含‘*’,'*'表示任意字符

int MaxLength(string str1, int begin1, int length1, string str2, int begin2, int length2) { while(length1 > 0) { for(int i = length1; i > 0; i--) { if(str1[begin1 + i - 1] != str2[begin2 + length2 - 1 - length1 + i]) break; if(1 == i) { return length1; } } length1--; } return 0; } int X(const string P, int (*prefix)[26]) { int m = P.length() + 1; int base = 0; int t = 0; for(int q = -1; q < m; q++) { if(P[q + 1] == '*') { base = q - t + 1; t++; continue; } for(int j = 0; j < 26; j++) { int k = m < q + 1? (m): (q + 1); //bool IsMax = false; string temp; temp.assign(P, base + t, k - base - t); temp = temp + char(j + 97); prefix[q + 1 - t][j] = base + MaxLength(P, base + t, k + 1 - base - t, temp, 0, temp.length()); } } return t; } //判读P是否是T的子串,其中P字符串中可以包含‘*’,'*'表示任意字符。 void match(string T, string P) { int n = T.length(); int prefix[P.length() + 1][26]; int base = X(P, prefix); int q = 0; for(int i = 0; i < n; i++) { int j = T[i] - 97; q = prefix[q][j]; if(q == P.length() - base) { cout << "yes" << endl; return; } } }

你可能感兴趣的:(C++,算法)