您的位置:首页 > 理论基础 > 数据结构算法

hdu 2087 剪花布条(数据结构:KMP)

2014-08-14 17:17 399 查看
典型的字符串匹配题目

但是不能直接用模板来做,因为对于下面这个例子:

aaaaaa aa

用KMP得出的结果是5

但答案==3,原因是匹配的串中不能重合

所以我们要在匹配成功后做一些处理保证不会出现重合的匹配串

我的做法是当匹配时

令 i += len2-1

其中len2为模式串的长度,这样可以保证直接跳过匹配成功的部分

代码如下:

#include <cstdio>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 1100
using namespace std;

int next[MAXN];
char str[MAXN], chs[MAXN];

void get_next(char p[]) {
int len = strlen(p);
int i = 0, j = -1;
next[0] = -1;
while(i < len) {
if(j==-1 || p[i]==p[j]) {
++i, ++j;
next[i] = j;
} else j = next[j];
}
}

int kmp(char t[], char s[]) {
int ans, i, j, len1, len2;
ans = i = j = 0;
len1 = strlen(t);
len2 = strlen(s);
get_next(s);
while(i < len1) {
if(j==-1 || t[i]==s[j])
++i, ++j;
else j = next[j];
if(j == len2) {
ans++;
i += len2-1;
}
}
return ans;
}

int main(void) {
while(scanf("%s", str) && str[0]!='#') {
scanf("%s", chs);
int ans = kmp(str, chs);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: