上午:
学习KMP算法
看网课
下午:
(因为是输入字符所以用了cin>>来输入)
思路:
得到前缀表,输出(即最后一排的数字)
利用前缀表来判断下一步要和谁比对
#include<bits/stdc++.h>
using namespace std;
int prefix[1000001];
int lens1,lens2;
char s1[1000001],s2[1000001];
void get_next()
{
int j=0;
//得到前缀数组
//(因为kmp[1]=0,而全局变量本来就会自动复制你为0,所以这里可以省略)
for (int i=2;i<=lens2;i++)
{
while(j!=0&&s2[i]!=s2[j+1])
j=prefix[j];
if(s2[j+1]==s2[i])
j++;
prefix[i]=j;
}
}
//可以用这个函数来找到下一步要比对的位置
void KMP()
{
int j=0;
for(int i=1;i<=lens1;i++)
{
while(j>0&&s2[j+1]!=s1[i])
j=prefix[j];
if(s2[j+1]==s1[i])
j++;
if(j==lens2)
{
cout<<i-lens2+1<<endl;
}
}
}
int main()
{
//首先输入两个字符串
cin>>s1+1;
cin>>s2+1;
//得到两个字符串的长度
lens1=strlen(s1+1);
lens2=strlen(s2+1);
//通过get_next函数来得到前缀表prefix[];(这一步我已经解决)
get_next();
//再通过函数KMP得到匹配字符串的准确位置
KMP();
//按照题目要求输出前缀表
for (int i=1;i<=lens2;i++)
cout<<prefix[i]<<" ";
cout<<endl;
return 0;
}
晚上:
学习哈希