zoukankan      html  css  js  c++  java
  • kmp匹配算法

     1 #include<iostream>
     2 #include <string>
     3 #include <vector>
     4 using namespace std;
     5 //根据子串建表 
     6 template<typename T1> void buildMatch(T1 &pattern, vector<int> &match){
     7     int i;
     8     match[0] = -1;//将表的第一个位置置为-1 
     9     for(int j = 1; j < pattern.size(); j++){//从第二个元素开始比较 
    10         i = match[j - 1];//将match前一个坐标给i
    11         while((i >= 0) && (pattern[i + 1] != pattern[j])){
    12             i = match[i];//回退取出最近一个匹配的下标 (i指针从-1开始) 
    13         }
    14         if(pattern[i + 1] == pattern[j]){//子串当前位置的元素等于i指针后一个位置指向的元素 
    15             match[j] = i + 1;//match[j]已经匹配子串的下标 
    16         }else{
    17             match[j] = -1;
    18         }
    19     }
    20 }
    21 
    22 template<typename T1> int KMP(T1 &obj1, T1 &pattern){
    23     int n = obj1.size(); //主串 
    24     int m = pattern.size();//被查找字串 
    25     if(n < m){//如果主串长度小于子串必然找不到 
    26         return -1;
    27     }
    28     vector<int> match(pattern.size());//根据子串的长度建表 
    29     buildMatch(pattern, match);
    30     int s = 0, p = 0;//s为主串指针,p为子串指针 
    31     while(s < n && p < m){
    32         if(obj1[s] == pattern[p]){ //主串和子串位置元素匹配 
    33             p++;//俩个指针同时走 
    34             s++;
    35         }else if(p > 0){//将指针指到匹配到的最大子串的下一个位置 
    36             p = match[p - 1] + 1;
    37         }else{//当p指向0位置时没有匹配到 
    38             s++;//主串指针移动 
    39         }
    40     }
    41     return p == m ? s - m : -1;
    42 }
    43 int main(){
    44     string obj;
    45     getline(cin, obj);
    46     string pattern;
    47     getline(cin, pattern);
    48     int p = KMP(obj, pattern);
    49     if(p == -1){
    50         cout << "Not Found.
    ";
    51     }else{
    52         cout << p << endl;
    53     }
    54 //    vector<int> vec(10);
    55 //    vector<int> vec1(3);
    56 //    int n = vec.size();
    57 //    for(int i = 0; i < n; i++){
    58 //        cin >> vec[i];
    59 //    }
    60 //    n = vec1.size();
    61 //    for(int i = 0; i < n; i++){
    62 //        cin >> vec1[i];
    63 //    }
    64 //    int p = KMP(vec, vec1);
    65 //    if(p == -1){
    66 //        cout << "Not Found.
    ";
    67 //    }else{
    68 //        cout << p << endl;
    69 //    }
    70     return 0;
    71 } 

     优秀博文推荐http://www.cnblogs.com/yjiyjige/p/3263858.html

    http://www.cnblogs.com/c-cloud/p/3224788.html

  • 相关阅读:
    PHP实现URL长连接转短连接方法总结
    session共享原理以及PHP 实现多网站共享用户SESSION 数据解决方案
    session跨域共享解决方案
    MySQL 对于千万级的大表要怎么优化?
    防sql注入方法
    MYSQL性能优化分享(分库分表)
    mysql 分库分表
    mysql 性能优化方案
    MYSQL 优化常用方法
    第一站---大连---看海之旅
  • 原文地址:https://www.cnblogs.com/AGoodDay/p/10778260.html
Copyright © 2011-2022 走看看