我的中国大学MOOC-陈越、何钦铭-数据结构-2018秋代码仓:https://github.com/617076674/MOOC-DataStructure-2018-Autumn
题目描述:
知识点:KMP算法
思路一:用strstr()函数
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
C++代码:
#include<iostream>
#include<cstring>
char input[1000001], pattern[100001];
int N;
int main() {
scanf("%s", input);
scanf("%d", &N);
for(int i = 0; i < N; i++) {
scanf("%s", pattern);
char* index = strstr(input, pattern);
if(index == NULL) {
printf("Not Found\n");
} else {
printf("%s\n", index);
}
}
return 0;
}
C++解题报告:
思路二:自己实现KMP算法
时间复杂度是O(N * (m + n)),其中m是输入字符串的长度,n是pattern的长度。空间复杂度是O(1000000)。
C++代码:
#include<iostream>
#include<cstring>
char input[1000001], pattern[100001];
int N, next[100001];
void getNext(char s[], int len);
int KMP(char input[], char pattern[]);
int main() {
scanf("%s", input);
scanf("%d", &N);
for(int k = 0; k < N; k++) {
scanf("%s", pattern);
int index = KMP(input, pattern);
if(index == -1){
printf("Not Found\n");
}else{
printf("%s\n", input + index);
}
}
return 0;
}
void getNext(char s[], int len){
int j = -1;
next[0] = -1;
for(int i = 1; i < len; i++){
while(j != -1 && s[j + 1] != s[i]){
j = next[j];
}
if(s[i] == s[j + 1]){
j++;
}
next[i] = j;
}
}
int KMP(char input[], char pattern[]){
int inputLen = strlen(input);
int patternLen = strlen(pattern);
getNext(pattern, patternLen);
int j = -1;
for(int i = 0; i < inputLen; i++){
while(j != -1 && input[i] != pattern[j + 1]){
j = next[j];
}
if(input[i] == pattern[j + 1]){
j++;
}
if(j == patternLen - 1){
return i - patternLen + 1;
}
}
return -1;
}
C++解题报告: