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

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

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;

}

  

你可能感兴趣的:(后缀数组)