zoukankan      html  css  js  c++  java
  • 字符串匹配——KMP算法

    直接放代码

    #include <iostream>
    #include <cstring>
    #include <cmath>
    using namespace std;
    int main()//注意!我是一个C++的新手,用C风格字符串,我还让字符串下标看起来是从1开始,更好看一点 
    {
        int i {},j {};
        char a[101] {},b[101] {};
        int p[101] {};//其实我也不熟悉它的定义,反正p[i]可以简单理解为在b[i]取一个b[p[i]],使得b[i]=b[p[i]] 
        cin>>a+1;
        cin>>b+1;
        int n=strlen(a+1),m=strlen(b+1);//n表示a的长度,m表示b的长度 
        j=0;
        p[1]=0;//p[1]前面没有东西,当然是0了! 
        for(i=2;i<=m;i++)
        {
            while ((j>0)&&(b[j+1]!=b[i])) j=p[j];//找一个满足b[j+1]==b[i]的j 
            if (b[j+1]==b[i]) j++;//变成了b[j]==b[i],使得这一位可以匹配 
            p[i]=j;//又变成了b[p[i]]==b[i],满足p的定义 
        }
        j=0;
        for(i=1;i<=n;i++)
        {
            while ((j>0)&&(b[j+1]!=a[i])) j=p[j];//找一个满足b[j+1]==a[i]的j
            if (b[j+1]==a[i]) j++;//变成b[j]=a[i],使得这一位可以匹配 
            if (j==m)//即是b匹配完了 
            {
                cout<<i-m+1<<endl;//输出b在a的起始位置 
                j=p[j];//找下一个,如果不再找直接break 
            }
        }
        return 0;
    }
  • 相关阅读:
    无题
    生活真像小说
    草样年华
    Intentional Programming
    厌倦说话
    解释 Intentional Programming
    开始折腾iphone cdma 恢复,降级,刷机,越狱,手编,写号
    新手如何成为更好的图形设计师
    Grunt.js 初使用
    有抱负的程序员应看的10个TED演讲
  • 原文地址:https://www.cnblogs.com/jz-597/p/11145317.html
Copyright © 2011-2022 走看看