字符串查找算法(转载)

Sunday算法: 
后来,我又发现了一种比BM算法还要快,而且更容易理解的算法,就是这个Sunday算法: 
这里写图片描述 
首先原字符串和子串左端对齐,发现“T”与“E”不匹配之后,检测原字符串中下一个字符(在这个例子中是“IS”后面的那个空格)是否在子串中出现,如果出现移动子串将两者对齐,如果没有出现则直接将子串移动到下一个位置。这里空格没有在子串中出现,移动子串到空格的下一个位置“A”: 
这里写图片描述 
发现“A”与“E”不匹配,但是原字符串中下一个字符“E”在子串中出现了,第一个字符和最后一个字符都有出现,那么首先移动子串靠后的字符与原字符串对齐: 
这里写图片描述 
发现空格和“E”不匹配,原字符串中下一个字符“空格”也没有在子串中出现,所以直接移动子串到空格的下一个字符“E”: 
这里写图片描述 
这样从头开始逐个匹配,匹配成功! 
时间复杂度:最差情况O(MN),最好情况O(N)

//实际我写好像可以是o(M+N)啊。。

代码粘一下:

 

复制代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
char a[10005],b[10005];//long a>long b
int c[30];//表示b串中存在的字母;不存在则为1,存在为最靠后的此字符距离尾部加一(要跳的地方) 
int la,lb;//字符串a,b的长度 
int head;//当前搜索到的头字符 
int main()
{
    scanf("%s",a);
    scanf("%s",b);//read in
    la=strlen(a);
    lb=strlen(b); 
    for(int i=0;i<=lb-1;i++)
        c[b[i]-'a'+1]=lb-i;//初始化c数组 
    for(int i=0;head<=la-1;)//i表示当前匹配长度 ,head指针跳到a尾时结束 
    {
        if(a[head+i]==b[i])
        {
            i++;//匹配则更新i值
            if(i==lb) //匹配到的长度等于b串长度 则成功 
            {
                printf("Yes");return 0;
            }
        }        
        else
        {
            if(c[a[head+lb]-'a'+1]!=0) head=head+c[a[head+lb]-'a'+1];//判断是否出现
            else head=head+lb+2; //未出现,跳到下一个长度 
            i=0;//匹配值更新为0
        }         
    }
    printf("No");
    return 0;
}

暂时记录下来,
来源:https://www.cnblogs.com/Franky-ln/p/5890201.html

转载于:https://www.cnblogs.com/EvildoerOne/p/8405544.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值