分析:
1 题目要求的是给定一个文本串和给定一个模式串,求文本串中有几个模式串。
2 注意文本串为"aaaaaa",模式串"aa"的时候,ans = 3 而不是5。
代码:
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 1010 int ans; char text[MAXN]; char pattern[MAXN]; int next[MAXN]; /*求next数组*/ void getNext(){ int m = strlen(pattern); next[0] = next[1] = 0; for(int i = 1 ; i < m ; i++){ int j = next[i]; while(j && pattern[j] != pattern[i]) j = next[j]; next[i+1] = pattern[i] == pattern[j] ? j+1 : 0; } } /*匹配*/ void find(){ ans = 0; int m = strlen(pattern); int n = strlen(text); int j = 0;/*模式串的下标*/ for(int i = 0 ; i < n ; i++){ while(j && pattern[j] != text[i]) j = next[j]; if(pattern[j] == text[i]) j++; if(j == m){ ans++; j = 0;/*这个地方注意防止出现输入aaaaaa aa 输出5的情况*/ } } printf("%d\n" , ans); } int main(){ while(1){ scanf("%s" , text); if(!strcmp(text , "#")) break; scanf("%s" , pattern); getNext(); find(); } return 0; }