单调栈与单调队列
适用题目:适用于’输出每个数左/右边第一个比它小的数’或’定长范围内的最大(最小)值’类型的题目
核心思维:在每次都输出最值的题目中,每有一个新值进来,都与目前队列/栈里面的一端极值进行比较,只有有可能被输出出来的东西可以进栈,永远不可能被输出的东西直接从输入阶段就被淘汰,这样下来最终形成队列/栈的值是单调递增/递减的
代码略
因为单调队列/栈主要的是思路,实现很简单
KMP算法
KMP类型题目描述:
给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。
模板串P在模式串S中多次作为子串出现。
求出模板串P在模式串S中所有出现的位置的起始下标。
核心思维:
KMP的核心步骤在于求next数组,用于指明在匹配失败的情况下把指针重新定位到哪里。(ne[i]表示以i结尾的字符串,前缀和后缀长度为ne[i]的子串相等,且该子串的长度最大)
关于KMP的基本思路在此不赘述,可参考一下博客/视频:
博客、详解视频
求next数组的过程,其中p为模板串、s为格式串
//是p自身的找寻过程
for(int i=2,j=0;i<=n;i++)
{
while(j&&p[i]!=p[j+1]) j=ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
kmp匹配过程
//是p串与s串之间交互的操作
for(int i=1,j=0;i<=m;i++)
{
while(j&&s[i]!=p[j+1]) j=ne[j];
if(s[i]==p[j+1]) j++;
if(j==n)
{
printf("%d ",i-n);
j=ne[j];
}
}