字符串查找_字符串查找算法研究(1):BF算法

本文探讨了字符串查找算法中的BF算法,详细解析了其工作原理和应用场景。
摘要由CSDN通过智能技术生成

点击上方 蓝字关注我们

99e0a293d99b8239ce0da0e7f7e282ff.png 字符串查找又称字符串匹配,也称模式匹配,下面用“模式匹配”指代“字符串查找”。 模式匹配技术是计算机科学中的经典问题之一,它在内容过滤防火墙、入侵检测系统和生物信息等领域中有着重要的应用。过去的几十年中,人们提出了多种模式匹配算法,并应用于不同的场合。 模式匹配是指在长度为n的字符串 T【1…n】中,查找长度分别为m1、m2…mr的字符串的所有出现位置。字符串T称作文本串,也叫目标串。待查找的字符串P【1…mi】、P2【1…m2】……P,【1….m,】称作模式串。在匹配过程中,若文本串某个字符Ti与对应位置的所有模式串字符均不相同,则称在文本串字符Ti处发生了失配。若某个字符串 Pj的所有字符与文本串对应位置的所有字符均相等,则称模式串 Pj 得到匹配。 模式匹配是信息领域中重要的研究方向之一,长期以来,许多学者对模式匹配算法进行研究,提出许多不同的模式匹配算法。本文介绍了一种典型的单模式匹配算法,并分析了他的时间复杂度及优缺点。 BF 算法 BF 算法(BruteForce Algorithm)是最早的单模式匹配算法,也叫蛮力算法或朴素字符串匹配算法。其基本思想是∶循环找出模式串在文本串中所有出现位置。 设文本串为 T【1….n】,模式串为P【1..m】。BF 算法步骤描述如下∶ (i)初始状态。将模式串首字符和文本串的首字符对齐,模式串移动方向从左向右,字符比较方向从左向右,i和j为比较指针。如图3.1所示∶ 4c97ad2750395f15ba9e6d552da6577a.png (ii)字符比较。在当前匹配窗口内,从左向右比较文本串和模式串对应位置的字符。若每个位置字符都对应相等,则得到一个匹配,输出匹配信息,转到步骤(iii);否则,若在某个位置字符不相等,转到步骤(iii), (iii)移动模式串。若当前模式串尾字符Pm和文本串尾字符T3对齐,匹配结束;否则,将模式串右移1 位,转(ii) BF 算法简单直观,易于理解,但匹配效率低,在最坏情况下时间复杂度为O(m*n)。 C语言代码
/*
*代码功能: 判断一个字符串是否是另一个字符串的子串
*
* Author: 阿汤哥
* 微信公众号:C语言修仙
*/

#include
#include 

/*mystrstr() - 函数功能:判断一个字符串是否是另一个字符串的子串
*@string: 一个字符串
@pattern: 另一个字符串
*返回值:如果是字串,那么返回首次出现的地址
*/
char * mystrstr(const char * string, const char * pattern){
    int pattern_len = strlen(pattern);
    char * p = string;
    char * i = p, *j = pattern;

    while(*(p+pattern_len -1) != '\0'){

        while(*i == *j  && *j != '\0'){
            i++;
            j++;
            ;
        }

        if (*j == '\0'){
            printf("patter is the sub string of string\n");
            return p;
        }

        p++;
        i = p;
        j =pattern;
    }

    return NULL;
    printf("No Match!\n");

}


int main(void){
    const char * string = "I like China very much 20200605";

    const char * pattern1  = "ry much 20200605";
    const char * pattern2  = "china";
    const char * pattern3  = "China";
    const char * pattern4  = "0605";
    const char * pattern5  = "604";
    const char * pattern6  = "";

    mystrstr(string, pattern1);
    mystrstr(string, pattern2);
    mystrstr(string, pattern3);
    mystrstr(string, pattern4);
    mystrstr(string, pattern5);
    mystrstr(string, pattern6);
    return 0;
}
运行结果

0652403c01a8c7eaa29da39eb18ce829.png

往期推荐好文

★C语言编程工具的选择 

★求1000以内的水仙花数

★i++和++i有什么区别? ★「建议收藏」C语言编程判断回文数★看完你就明白:什么情况下该用int main(int argc, char *argv[])而不是int     main(void)★C语言编程:打印一个圆形★福利:50本C语言电子书免费送了! ★C语言编程求解:1到1000之间所有的素数 ★ [必读]C语言学习者常见问题及回答

3b84dc20c6e06b4b3cc89db5d31fc985.png

点个在看

你最好看

aa7b3ff8797ef8b1da0b951eb4b48281.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值