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


算法描述
首先獲得後綴數組,然後
1.第一行第一個字符a,與第二行第一個字符b比較,不等,則
2.第一行前兩個字符ab,與第三行前兩個字符cb比較,不等,則
3.第一行前三個字符abc,與第四行前三個字符bcb比較,不等,則
4.第一行前四個......
上述過程就相當於在原始字符串中,
第一趟,a與b比較,ab與cb比較,abc與bcb比較,abcb與cbca比較,abcbc與bcabc比較,abcbcb與cabc比較......
第二趟,b與c比較,bc與bc比較(相等,則繼續向後取長度爲2的子串比較,碰到不等爲止,本例中因碰到ab停止),bcb與cbc比較......
第三趟,c與b比較,cb與cb比較(相等),cbc與bca比較......
......
使用後綴數組方便編程實現






//vs2005
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <utility>
#include <string>
using namespace std;

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));
		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)
				{
					if(substrs[i].substr(0,j-i)==substrs[k].substr(0,j-i))
						++count;
					else
						break;
				}
				if(count>maxcount)
				{
					maxcount=count;
					substr=substrs[i].substr(0,j-i);
				}
			}
		}
	}
	return make_pair(maxcount,substr);
}

int _tmain(int argc, _TCHAR* argv[])
{	string str;
	pair<int,string> rs;

	str="abcbcbcabc";
		rs=fun(str);
		cout<<rs.second<<':'<<rs.first<<endl;

	return 0;
}






 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章