程序员面试宝典:求一个字符串中连续出现次数最多的子串

  1. 基本算法描述: 
  2.     给出一个字符串abababa  
  3.     1.穷举出所有的后缀子串 
  4.         substrs[0] = abababa; 
  5.         substrs[1] = bababa; 
  6.         substrs[2] = ababa; 
  7.         substrs[3] = baba; 
  8.         substrs[4] = aba; 
  9.         substrs[5] = ba; 
  10.         substrs[6] = a; 
  11.     2.然后进行比较 
  12.         substrs[0]比substrs[1]多了一个字母,如果说存在连续匹配的字符,那么 
  13.         substrs[0]的第1个字母要跟substrs[1]首字母匹配,同理 
  14.         substrs[0]的前2个字母要跟substrs[2]的前2个字母匹配(否则不能叫连续匹配) 
  15.         substrs[0]的前n个字母要跟substrs[n]的前n个字母匹配. 
  16.         如果匹配的并记下匹配次数.如此可以求得最长连续匹配子串.    
  17. #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    pair< int ,string >fun( const string &str )
    {
    	vector<string> substrs;
    	int len = str.size();
    	int maxcount = 1;
    	int count = 1;
    	string sub;
    	for( int i =0 ; i < len ; i++ )
    	{
    		substrs.push_back(str.substr(i,len-i));
    	}
    
    	for( int i=0; i < len; i++ )
    	{
    		for( int j = i+1; j < len; j++ )
    		{
    			count=1;
    			for( int k = j; k < len; k+= j-i)
    			{
    				
    
    				if( str.substr(i,j-i)==substrs[k].substr(0,j-i))
    					count++;
    				else
    					break;
    			}
    			if( count > maxcount )
    			{
    				maxcount=count;
    				sub=str.substr(i,j-i);
    			}
    		}
    		
    	}
    	return make_pair(maxcount,sub);
    }
    	
    int main()
    {
    	char c[]="abcbcdbc";
    	string str(c);
    	pair<int,string> result;
    	result=fun(str);
    	cout<<result.first<<endl;
    	cout<<result.second<<endl;
    
    	
    	system("pause");
    	return 0;
    }
    

      

      
posted @ 2013-08-23 20:06  NinaGood  阅读(242)  评论(0编辑  收藏  举报