原题链接:数据结构-定位子串
方法一:滑窗法。时间是 O(n*m)
#include <iostream>
#include <cstring>
#define Max_nums 100
using namespace std;
int findSubIndex(char *str1, char* str2){
for(int i=0; i<=strlen(str1)-strlen(str2); i++){
int j=0;
// 这里开个大小strlen(str2)的滑窗
while(j<strlen(str2) && str1[i+j]==str2[j]) j++;
if(j==strlen(str2)) return i+1;
}
return 0;
}
int main(){
char str1[Max_nums],str2[Max_nums];
while(cin>>str1>>str2){
cout<< findSubIndex(str1, str2)<<endl;
}
return 0;
}方法二:kmp算法。时间: O(m+n)
kmp算法学习:https://www.cnblogs.com/yejifeng/p/10317390.html
#include <iostream>
#include <cstring>
#define Max_nums 100
using namespace std;
void getNext(char *str, int *next){
//生成next数组值
next[0] = -1;
int k=-1, j=0;
while(j < strlen(str)){
if(k==-1 || str[k]==str[j])
next[++j] = ++k;
else
k=next[k];
}
}
int findSubIndex_KMP(char *str1, char *str2, int *next){
//查找模式串str2是否为主串str1的子串
//若是返回子串在母串中第一次出现的位置
//若不是则输出0
int i=0, j=0;
int len2=strlen(str2); //strlen()返回无符号整数,不能用于和负数比较
while(i<strlen(str1) && j<len2){
if(j==-1 || str1[i]==str2[j]){
i++;
j++;
}
else
j=next[j];
}
return j==strlen(str2) ? i+1-j : 0;
}
int main(){
char str1[Max_nums],str2[Max_nums];
int next[Max_nums];
while(cin>>str1>>str2){
getNext(str2, next);
cout<<findSubIndex_KMP(str1,str2,next)<<endl;
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复