题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087
这题水的不要不要的,各种数据都能过,醉醉的
写他的目的是在KMP专题上随时都要充实自己,又长知识了。
kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。
常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的
复杂度是O(nm)。kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m)。
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int maxn=1005; const int INF=0x3f3f3f3f; char s1[maxn], s2[maxn]; int main() { while(scanf("%s", s1), strcmp(s1, "#")) { scanf("%s", s2); int len1=strlen(s1); int len2=strlen(s2); if(len1<len2) { printf("0 "); continue; } int ans=0, f=1; for(int i=0; i<len1; i++) { if(s1[i]==s2[0]) { for(int j=1; j<len2; j++) { i++; if(s1[i]!=s2[j]) { f=0; break; } } if(f) ans++; else f=1; } } printf("%d ", ans); } return 0; }
用指针解决
直接调用库函数strstr()。
strstr 语法:
#include <string.h>
char *strstr( const char *str1, const char *str2 );
功能:函数返回一个指针,它指向字符串str2 首次出现于字符串str1中的位置,如果没有找到,返回NULL。
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int maxn=1005; const int INF=0x3f3f3f3f; char s1[maxn], s2[maxn]; int main() { while(scanf("%s", s1), strcmp(s1, "#")) { scanf("%s", s2); char *p; int len=strlen(s2); int ans=0; for(p=s1; p=strstr(p, s2); ans++, p+=len); printf("%d ", ans); } return 0; }