#include <iostream>
#include <string>
#define MAX_CHAR 256//用字符对应的ascii码作为数组下标
#define MAX_LENGTH 1000
using namespace std;
void GetNext(string & p, int & m, int next[])
{
for (int i = 0; i < MAX_CHAR; i++)
next[i] = -1;//初始化为-1,如果倒着没找到相应的字符则证明这m个字符
//可以直接跳过
for (int i = 0; i < m; i++)
next[p[i]] = i;
//将每一个字符对应的next数组值变为该字符在字符串中最后一次出现的位置
}
void Sunday(string & s, int & n, string & p, int & m)
{
int next[MAX_CHAR];
GetNext(p, m, next);
int j; // s 的下标
int k; // p 的下标
int i = 0;
while (i <= n - m)
{
j = i;
k = 0;
while (j < n && k < m && s[j] == p[k])
j++, k++;
if (k == m)
cout << "在" << i << " 处找到匹配\n";
if (i + m < n)
i += (m - next[s[i + m]]);
//next[s[i + m]即模式串对应主串再往后一个字符,寻找这个字符在模式串中的位置
else
return;
}
}
int main()
{
string s, p;
int n, m;
while (cin >> s >> p)
{
n = s.size();
m = p.size();
Sunday(s, n, p, m);
cout << endl;
}
return 0;
}
sunday算法注释
最新推荐文章于 2021-03-18 19:54:09 发布