最长重复子串(LongestRepeatSubstring)

一个单字符串问题。子字符串a在字符串S中至少出现两次,则称a是S的重复子串。如果某个子串在目标字符串中出现两次,那么它必将出现在两个不同的后缀中,因此对后缀数组进行排序,以寻找相同的后缀,然后扫描数组,比较相邻的元素便可以找出最长的重复子串。

#include<iostream>
using namespace std;

int comlen(char* a, char* b)
{
	int len = 0;
	while(a && b && *b)
		if(*a++ == *b++)
			len++;
	return len;
}

int pstrcmp(const void* a, const void* b)
{
	return strcmp(*(char**)a, *(char**)b);
}

int LongestRepeatSubstring_Suffix(char* arr, int len, char* &index)
{
	char** suffix = new char*[len];
	for(int i = 0; i < len; ++i)
		suffix[i] = &arr[i];
	qsort(suffix, len, sizeof(char*), pstrcmp);

	int length_LRS = 0;
	for(int i = 0; i < len-1; ++i)
	{
		int len = comlen(suffix[i], suffix[i+1]);
		if(len > length_LRS)
		{
			length_LRS = len;
			index = suffix[i];
		}
	}
	delete []suffix;
	return length_LRS;
}

int main()
{
	char* a = "abcdeabcdfabcdf";
	char* index_LRS;
	int len = LongestRepeatSubstring_Suffix(a, 15, index_LRS);
	cout<<len<<endl;

	for(int i = 0; i < len; ++i)
		cout<<*index_LRS++;
	cout<<endl;

	return 0;
}

你可能感兴趣的:(最长重复子串)