数据结构笔记(五)——串Ⅱ:模式匹配

本文介绍了串的模式匹配问题,包括顺序存储结构和链式存储结构。重点讲解了三种算法:蛮力算法的时间复杂度为O(nm),KMP算法通过next数组优化达到O(m+n),以及BM算法利用坏字符和好后缀表在最坏情况下达到O(n+m),并分别解析了next数组和bc[]、gs[]表的构造原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 串的存储结构:与线性表相同,分顺序存储结构和链式存储结构。

  2. 模式匹配:对基于同一字符表的任何文本串T(|T|=n)和模式串P(IPl=m),判定T中是否存在某一子串与P相同。若存在(匹配),则报告该子串在T中的起始位置。

  3. 蛮力算法(朴素算法):将P与T中长度为m的n-m+1个子串逐一比对。
    ·时间复杂度:O([n-m+1]*m),渐进O(nm)。

int match(char* P,char* T){
   //串匹配算法(Brute-force-1)
    size_t n = strlen(T), i = 0;//文本串长度、当前接受比对字符的位置
    size_t m = strlen(P), j = 0;//模式串长度、当前接受比对字符的位置
    while(j < m && i < n)//自左向右逐个比对字符
        if(T[i] == P[j])//若匹配
            {
   i++; j++;}//则转到下一对字符
        else//否则
            {
   i -= j-1; j = 0;}//文本串回退、模式串复位
    return i - j;//如何通过返回值,判断匹配结果?
}

int match(char* P,char* T){
   //串匹配算法(Brute-force-2)
    size_t n = strlen(T), i=0;//文本串长度、与模式串首字符的对齐位置
    size_t m = strlen(P), j;//模式串长度、当前接受比对字符的位置
    for(i = 0; i < n - m + 1; i++){
   //文本串从第1个字符起,与
        for(j = 0;j < m;j++)//模式串中对应的字符逐个比对
            if(T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值