KMP算法自我理解 和 模板
字符串 abcd abc abcd abc
匹配串 cdabcd
匹配串的 next 0 0 0 0 1 2;
开始匹配
abcd abc abcd abc
cd abc d
a,d 匹配失败
next 数组进行移动
abcd abc abcd abcd
c dabcd
再次匹配
模板
这个算法有些问题(尚未找到修改方法)
#include<bits/stdc++.h>
using namespace std;
;
];
// next 数组首位为 0
int KMP(string ss,string tt)
{
nt[]=;
,k=;p<tt.size();p++)
{
&& tt[k]!=tt[p])
k=tt[k-];
if(tt[k]==tt[p])
k++;
nt[p]=k;
} // 构建 next 数组
,k=;p<ss.size();p++)
{
&& ss[p]!=tt[k])
k=tt[k-];
if(ss[p]==tt[k])
k++;
if(k==tt.size())
{
cout<<<<" "<<p<<endl;
;
}
}
;
}
int main()
{
string ss,tt;
cin>>ss>>tt;
cout<<KMP(ss,tt)<<endl;
}
next[0]=-1;
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
];
];
];
int KMP()
{
int s=strlen(ss); // ss
int t=strlen(tt);
nt[]=-;
;
,j=-;i<s;)
{
||ss[i]==ss[j])
{
i++; j++;
nt[i]=j; // next[1]=0;
}
else
j=nt[j];
}
//for(int i=0;i<s;i++)
//cout<<nt[i]<<endl;
,j=;i<t;)
{
||ss[j]==tt[i])
{
i++; j++;
}
else j=nt[j];
if(j==s)
{
num++;
j=;
}
}
return num;
}
int main()
{
]!='#')
{
scanf("%s",ss);
cout<<KMP()<<endl;
}
}
KMP算法自我理解 和 模板的更多相关文章
- 自己对kmp算法的理解,借由 28. 实现 strStr() 为例
做题思路 or 感想 : 就借由这道题来理解一下kmp算法吧 kmp算法的操作过程我觉得有句话很合适 :KMP 算法永不回退 目标字符串 的指针 i,不走回头路(不会重复扫描 目标字符串),而是借助 ...
- KMP算法,匹配字符串模板(返回下标)
//KMP算法,匹配字符串模板 void getNext(int[] next, String t) { int n = next.length; for (int i = 1, j = 0; i & ...
- KMP算法 --- 深入理解next数组
在KMP算法中有个数组,叫做前缀数组,也有的叫next数组. 每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符. 当然它描述的也是子串的对称程度,程度越高,值 ...
- KMP算法的理解
---恢复内容开始--- 在看数据结构的串的讲解的时候,讲到了KMP算法——一个经典的字符串匹配的算法,具体背景自行百度之,是一个很牛的图灵奖得主和他的学生提出的. 一开始看算法的时候很困惑,但是算法 ...
- 关于《数据结构》课本KMP算法的理解
数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...
- 关于KMP算法的理解
上次因为haipz组织的比赛中有道题必须用到KMP算法,因此赛后便了解了下它,在仔细拜读了孤~影神牛的文章之后有种茅塞顿开的感觉,再次ORZ. 附上链接http://www.cnblogs.com/y ...
- 我对KMP算法的理解
KMP算法的核心在于失配回溯表——pnext,相比于通过逐个比较来匹配字符串的朴素算法,KMP通过对模式串的分析,可以做到比较指针在主串上不回溯,一直向前. 1. KMP如何实现不回溯? 对于主串 t ...
- AC自动机自我理解和模板
给出长度为m的文本 查询 n个单词出现的次数 用kmp 复杂度 n*m*(单词平均长度) 用字典树 复杂度 m*每次字典树遍历的平均深度) AC自动机 复杂度 m (思路可以理解为kmp+字典树 ) ...
- 第十一章 串 (c3)KMP算法:理解next[]表
随机推荐
- shell 通配符
Bash中的通配符 '?' 匹配一个任意字符 '*' 匹配0个或任意多个字符,也就是可以匹配任何内容 '[]' 匹配括号中任意一个字符.例如[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c ...
- java的小程序在html中的运行测试
java的小程序在html中的运行测试,打开vs2012,以网站模式打开,生成,调用iis临时服务器运行.
- hdu1693
题解: 还是插头dp 代码: #include<cstdio> #include<cstring> #include<algorithm> #include< ...
- SpringBoot document notes
图片拷贝不过来,直接从github上下载 . 链接: https://github.com/DFX339/SpringBootDocumentNotes.git Create a example po ...
- 据说excel流是这么做,上次我分享的是csv格式。这个是excel格式。
import xlwt import StringIO import web urls = ( '/rim_request','rim_request', '/rim_export','rim_exp ...
- 7.8 C++容器适配器
参考:http://www.weixueyuan.net/view/6405.html 总结: 容器适配器是用基本容器实现的一些新容器,这些容器可以用于描述更高级的数据结构. 容器适配器有三种:sta ...
- Log4j 日志记录
关于Log4j的简单示例 <!--手动配置log4j.properties文件内容:-->1 #level:debug/info/warn/error log4j.rootLogger=O ...
- Problem C: 默认参数:求圆面积
Description 编写一个带默认值的函数,用于求圆面积.其原型为: double area(double r=1.0); 当调用函数时指定参数r,则求半径为r的圆的面积:否则求半径为1的圆面积. ...
- L291
If you are currently in the midst of planning a wedding, then I don't need to tell you how stressful ...
- 小波学习之一(单层一维离散小波变换DWT的Mallat算法C++和MATLAB实现) ---转载
1 Mallat算法 离散序列的Mallat算法分解公式如下: 其中,H(n).G(n)分别表示所选取的小波函数对应的低通和高通滤波器的抽头系数序列. 从Mallat算法的分解原理可知,分解后的序 ...