【c语言】——有关字符串查找的两个算法

假设现在有这样一个问题:有一个文本串S,和一个模式串P,现在要判断S中是否有和P匹配的子串,并查找P在S中的位置,怎么解决呢?这篇文章就为大家介绍了关于这个问题求解的两种算法。
一、BF算法
BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。

代码实现:

#include<stdio.h>
#include<string.h>
int BFMatch(char* s,char* p)
{
 int i,j;
 i = 0;
 //第一层循环,i不断遍历
 while(i < strlen(s))
 {
  j = 0;//当遇到不匹配的时候j又回溯
  while(s[i] == p[j] && j<strlen(p))
  {
   i++;
   j++;
  }
  if(strlen(p) == j)//字符串匹配成功
  {
   return i - strlen(p);//返回匹配字符串位置
  }
  i = i-j+1;//若没有匹配成功,i回退到本次匹配的开始位置
 }
 return -1;
}
int main()
{
 char* s1 = "ababab";
 char* s2 = "baba";
 int index = BFMatch(s1,s2);
 printf("目标串包含匹配串的起始位置:%d",index);
}

解析:BF匹配步骤如下:
在这里插入图片描述
二、KMP算法
KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。在匹配成功的自传中找到两个最长相等的真子串。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
具体解析见字符串匹配KMP详解

发布了62 篇原创文章 · 获赞 7 · 访问量 2586

猜你喜欢

转载自blog.csdn.net/qq_43412060/article/details/104283874