目录
- 0. 前言
- 1. 算法简介
- 2. 代码实现
- 3. 运行结果
0. 前言
使用朴素模式匹配算法查找子串是否位于主串中
开发环境:Dev-Cpp
操作系统:Windows10 专业版
1. 算法简介
朴素模式匹配算法,也称为暴力模式匹配算法或穷举法,是一种简单直接的字符串匹配算法。
算法思想: 在朴素模式匹配算法中,从主串的第一个字符开始与模式串进行比较,若相等,则继续比较下一个字符,否则从主串的下一个字符重新开始匹配。如果主串的剩余字符个数小于模式串的长度,则匹配失败;如果模式串的所有字符都能在主串中找到对应的字符,则匹配成功。
算法步骤:
- 从主串的第一个字符开始,依次和模式串的第一个字符进行比较;
- 如果两个字符相等,则比较下一个字符,直到模式串的最后一个字符;
- 如果模式串的所有字符都能在主串中找到对应的字符,则匹配成功;
- 如果模式串的某个字符与主串的某个字符不相等,则从主串的下一个字符重新开始匹配。
算法复杂度: 朴素模式匹配算法的时间复杂度为O((n-m+1)m),其中n为主串的长度,m为模式串的长度。最坏情况下,需要比较的次数为(n-m+1)m,即主串的每个字符都要进行m次比较。
算法优缺点: 朴素模式匹配算法实现简单,代码易于理解。但由于每次只比较一个字符,效率较低,适用于主串和模式串较短且规模较小的情况。对于较长的主串和模式串,建议使用其他更高效的字符串匹配算法,如KMP算法、Boyer-Moore算法等。
2. 代码实现
main.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
//修改此处 s1为主串,s2为子串
char s1[] = "abcdefg";
char s2[] = "abc";
int i,j;
int len_main = strlen(s1);
int len_son = strlen(s2);
printf("s1 is '%s'\n",s1);
printf("your find str is '%s'\n\n",s2);
//取出所有 i-j 区间的子串
for(i=0;i<len_main-len_son+1;i++)
{
char temp[len_son+1] = {};
j=i+len_son;
//如果j大于字串长度,即错误退出
if(j>len_main)
{
printf("false\n");
exit(0);
}
//开始找字串
for(int m=i,n=0;m<j;m++,n++)
temp[n] = s1[m];
//最后一位赋"\0"
temp[len_son] = '\0';
//比较
if(!strcmp(temp,s2))
printf("√ s1[%d:%d] is '%s'\n",i,j,temp);
else
printf("× s1[%d:%d] not is '%s',that is '%s'\n",i,j,s2,temp);
}
printf("\nend\n");
return 0;
}
3. 运行结果
查找abc
查找def
查找 jfha(不存在)
以上为暴力算法的结果,如果主串长度过长,则会造成时间复杂度几何倍数增长