zoukankan      html  css  js  c++  java
  • C++kmp算法

    查找字符串a是否包含子串b,不是用strA.find(strB) >0 而是 strA.find(strB) != string:npos

    #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 (j >= 0 && T[i - 1] != T[j]) j = next[j];//递推计算
            if (j >= 0 &&  T[i - 1] == T[j]) 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;
                }
            }
            if (pos == T.size() && (iter - index) == T.size()) ++count;
        }
        return count;
    }
      
    int main(int argc, char*argv[])
    {
        string S="abaabcacabaabcacabaabcacabaabcacabaabcac";
        string T="ab"; 
        //cin >> S;
        //cin >> T;
        string::size_type count = COUNT_KMP(S, T);
        cout << count << endl;
        system("PAUSE");
        return 0;
    }
  • 相关阅读:
    求解答可用性测试记
    Teambition可用性测试记
    海丁网可用性测试记
    go语言的切片
    go语言的数组
    go语言的函数
    go语言的接口
    go语言的结构体
    go语言的flag
    创建二叉树和三种遍历
  • 原文地址:https://www.cnblogs.com/zhangthree/p/11913105.html
Copyright © 2011-2022 走看看