• 字符串查找算法(转载)


    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
  • 相关阅读:
    前端模块化,AMD,CMD 总结
    前端基本网络协议知识整合
    websocket心跳机制
    js 数组方法的作用,各方法是否改变原有的数组
    React函数组件和类组件的区别
    js 单线程、宏任务与微任务的执行顺序
    js为什么是单线程
    allure清空上一次运行的记录(--clean-alluredir)
    allure的Tag标记(allure.story、allure.feature、severity)
    allure集成缺陷管理系统和测试管理系统(allure.link、allure.issue、allure.testcase)
  • 原文地址:https://www.cnblogs.com/EvildoerOne/p/8405544.html
Copyright © 2020-2023  润新知