后缀数组求字符串最长重复子串

求一个字符串的最长重复子串:

1.求字符串s的后缀数组suffix

2.suffix排序

3.求最长公共前缀

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<algorithm>
using namespace std;

int comlen(string s1,string s2)
{
	//计算两个字符串的最长公共前缀
	int i=0,j=0;
	int len=0;
	while(i<s1.size()&&j<s2.size())
	{
		if(s1[i]==s2[i]) 
	    {
			i++;j++;
			len++;
		}
		else return len;
	}
	return len;
}

string FindRepeatSubstr(string s)
{
	vector<string> suffix; //后缀数组
	string ans;
	int len=0;
	int maxlen=0;
	int i;
	for(i=0;i<s.size();i++)
	{
		suffix.push_back(s.substr(i,s.size()-i));
	}
	sort(suffix.begin(),suffix.end()); //给后缀数组排序
	for(i=0;i<suffix.size()-1;i++) //计算相邻两个后缀数组的最长公共前缀
	{
		len=comlen(suffix[i],suffix[i+1]);
		if(len>maxlen)
		{
			maxlen=len;
			ans=suffix[i].substr(0,maxlen);
		}
	}
	return ans;
}

int main()
{
	string str;
	while(cin>>str)
	{
		if(str=="") cout<<""<<endl;
		cout<<FindRepeatSubstr(str)<<endl;
	}
	return 0;
}

  

posted @ 2014-04-24 15:06  七年之后  阅读(626)  评论(0编辑  收藏  举报