朴素模式匹配算法(暴力寻找字串)

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(不存在)
在这里插入图片描述

以上为暴力算法的结果,如果主串长度过长,则会造成时间复杂度几何倍数增长

猜你喜欢

转载自blog.csdn.net/qq_53381910/article/details/131463743