kmp
来源:互联网 发布:老人海边摸蛤 知乎 编辑:程序博客网 时间:2024/06/18 07:10
class Solution {public: int kmpSearch(char *s,char *p,int next[]){ int i=0; int j=0; int sLen=strlen(s); int pLen=strlen(p); while(i<sLen&&j<pLen) { if(j==-1||s[i]==p[j]) { i++; j++; } else { j=next[j]; } } if(j==pLen) return i-j; else return -1;}void getNext(char *p,int next[]){ int pLen=strlen(p); next[0]=-1; int k=-1; int j=0; while(j<pLen) { if(k==-1||p[j]==p[k]) { k++; // p0p1...pk-1 pk pj-k...pj-1 pj 已知next[j]=k;求 next[j+1]=? 看pk是否和pj相等,若相等。next[j+1]=k+1; j++; next[j]=k;//否则 就往前走了,可能是是更小的一段。 } else k=next[k]; }} int strStr(char *a, char *b) { int lenA=strlen(a); int lenB=strlen(b); if(lenB>lenA) return -1; int *next=new int[strlen(a)]; getNext(b,next); return kmpSearch(a,b,next); }};
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;char mo[10005];char str[1000005];int N;int main() {scanf("%d", &N);while(N--) {scanf("%s %s", mo, str);int next[10005] = {-1};int i = 0, j = -1, len = strlen(mo);while(i < len) {//获得next函数 if(j == -1 || mo[i] == mo[j]) next[++i] = ++j;else j = next[j];}int ans = 0, len1 = strlen(str);i = j = 0;while(i < len1) {//求模式串在原串中出现的次数 if(j == -1 || str[i] == mo[j]) ++i, ++j;else j = next[j];if(j == len) ans++;}printf("%d\n", ans);}return 0;}
0 0
- KMP
- KMP
- KMP
- KMP
- KMP
- KMP
- kmp
- kmp
- KMP
- kmp
- KMP
- KMP
- KMP
- kmp
- KMP
- KMP
- kmp
- KMP
- Spring事务管理原理
- uva10815 Andy's First Dictionary(字符串的简单处理)
- 2015深圳电子展-第85届中国电子展概况
- 关于wamp不支持php中GD库的问题
- 历届试题 买不到的数目
- kmp
- 深入理解OAuth2.0协议
- android控件--Spinner的简单使用
- uva 10453 回文串dp uva 10739 uva 11151最长回文串 poj 3280
- 算法-字符串压缩
- 浮点型数据在内存中的存储
- iOS集成支付宝
- 使用MySQL Migration Toolkit快速将Oracle数据导入MySQL
- android开发 BaseAdapter中getView()里的3个参数的含义