zoukankan      html  css  js  c++  java
  • C++实现KMP模式匹配算法

    #include<iostream>
    #include<string>
    #include<vector>
    
    using namespace std; 
    
    void Next(const string & pat,vector<int> & next)
    {
    	next.resize(pat.length());
    	if(pat.length() == 0) 
    		return;
    	next[0] = -1;
    	
    	for(size_t pos = 1; pos < pat.length(); ++pos)
    	{
    		size_t sublen = pos-1;
    		while(sublen >= 0)
    		{	
    			if(pat.substr(0, sublen) == pat.substr(pos-sublen+1, sublen))
    				break;
    			--sublen;
    		}	
    		next[pos] = sublen;
    	}
    	return;
    }
    
    int main(void)
    {
    	string str1, str2;
    	while(cin >> str1 >> str2) {
    		vector<int> next;
    		Next(str2, next);
    
    		vector<int> pos;
    
    		int i = 0, j1 = 0, j2 = 0;
    		while(j1 < str1.length()) 
    		{
    			j2 = j1 - i;
    			if(j2 >= str2.length()) {
    				// found
    				pos.push_back(i);
    				// move on;
    				int delta = str2.length();
    				i = i + delta;
    				j1 = max(i,j1);	
    			}
    			else if(str1[j1] == str2[j2]) {
    				++j1;
    			}
    			else { 	// str1[j1] != str2[j2];
    				int delta = j2 - next[j2];
    				i = i + delta;
    				j1 = max(i,j1);
    			}
    		}
    
    		//output.
    		cout << "str1.length(): " << str1.length() << endl;
    		cout << "str2.length(): " << str2.length() << endl;
    		cout << "str1 from pos: " << endl;
    		for(int i = 0; i < pos.size(); ++i) 
    			cout << "[" << (i+1) << "]: " << str1.substr(pos[i], string::npos) << endl;
    		cout << "str2: " << str2 << endl;
    	}
    	return 0;
    }


    參考自: http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/09/2583133.html

  • 相关阅读:
    [LeetCode 题解]: Remove Duplicates from Sorted List
    [LeetCode 题解]: Merge k Sorted Lists
    [LeetCode 题解]: Insertion Sort List
    [LeetCode 题解]:Candy
    求任意多边形面积 python实现
    C++飞机大战
    version robot
    python一段代码 感受一下
    微机原理上机第四次实验内容
    初步的百度爬虫
  • 原文地址:https://www.cnblogs.com/llguanli/p/6892326.html
Copyright © 2011-2022 走看看