zoukankan      html  css  js  c++  java
  • KMP算法(C++版)

    有关字符串匹配的最有效的算法。

    其算法复杂度为两个字符串的长度之和(m+n)。

    与C语言版本想比,这个版本只是使用C++语法,功能还是被封装在函数中。

    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>
    #include <vector>
    
    using namespace std;
    
    inline void NEXT(const string &T, vector<int> &next)
    {
        //按模式串生成vector,next(T.size())
        next[0]=-1;
        for(int i=1; i<T.size(); i++) {
            int j = next[i-1];
            while(T[i] != T[j+1] && j >= 0)
                j = next[j];//递推计算
            if(T[i] == T[j+1])
                next[i] = j+1;
            else
                next[i] = 0;
        }
    }
    
    inline string::size_type COUNT_KMP(const string &S, const string &T)
    {
        //利用模式串T的next函数求T在主串S中的个数count的KMP算法
        //其中T非空,
        vector<int> next(T.size());
        NEXT(T, next);
        string::size_type index, count=0;
        for(index=0; index<S.size(); ++index){
            int pos=0;
            string::size_type iter=index;
            while(pos<T.size() && iter<S.size()){
                if(S[iter] == T[pos]){
                    ++iter;
                    ++pos;
                } else {
                    if(pos == 0)
                        ++iter;
                    else
                        pos = next[pos-1] + 1;
                }
            }//whileend
            if(pos==T.size() && (iter-index)==T.size())
                ++count;
        }//forend
        return count;
    }
    
    int main(void)
    {
        string S="abaabcacabaabcacabaabcacabaabcacabaabcac";
        string T="ab";
        string::size_type count=COUNT_KMP(S,T);
        cout << count << endl;
        return 0;
    }


  • 相关阅读:
    交换实验
    路由引入和控制
    ISIS
    BGP联盟
    BGP2
    bgp
    Linux日常总结
    配置本地yum源方法
    达梦数据库常见问题-安装
    达梦数据库常见问题-安装
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564922.html
Copyright © 2011-2022 走看看