程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 求一個字符串中連續出現次數最多的子串

求一個字符串中連續出現次數最多的子串

編輯:C++入門知識

#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
using namespace std;
/*基本算法描述:
    給出一個字符串abababa 
    1.窮舉出所有的後綴子串
         substrs[0] = abababa;
        substrs[1] = bababa;
        substrs[2] = ababa;
        substrs[3] = baba;
        substrs[4] = aba;
        substrs[5] = ba;
        substrs[6] = a;
    2.然後進行比較
        substrs[0]比substrs[1]多了一個字母,如果說存在連續匹配的字符,那麼
        substrs[0]的第1個字母要跟substrs[1]首字母匹配,同理
        substrs[0]的前2個字母要跟substrs[2]的前2個字母匹配(否則不能叫連續匹配)
        substrs[0]的前n個字母要跟substrs[n]的前n個字母匹配.
        如果匹配的並記下匹配次數.如此可以求得最長連續匹配子串.     
*/
pair<int,string> fun(const string& str)
{
	vector<string> substrs;
	int maxcount =1,count =1;
	string substr;
	int i,len =str.length();
	for(i=0;i<len;++i)
		substrs.push_back(str.substr(i,len-i));
	for(i=0; i<len; ++i) 
       cout << substrs[i] << endl;
	for(i=0;i<len;++i)
	{
		for(int j=i+1;j<len;++j)
		{
			count =1;
			if(substrs[i].substr(0,j-i)==substrs[j].substr(0,j-i))
			{
				++count;
				for(int k=j+(j-i);k<len;k +=j-i)//步長為j-i,子串的長度
				{
					if(substrs[i].substr(0,j-1)==substrs[k].substr(0,j-1))
						++count;
					else
						break;
				}
				if(count>maxcount)
				{
					maxcount = count;
					substr=substrs[i].substr(0,j-1);
				}
			}
		}
	}
	return make_pair(maxcount,substr);
}




int _tmain(int argc, _TCHAR* argv[])
{
	string str="abcbcbcabc";
	pair<int,string> rs = fun(str);
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved