最长重复字符串

求解一个字符串中出现的最长的重复的字符串,可以重叠

可以使用后缀数组的解法,先建立后缀数组,然后将数组排序,最后比较相邻的数组之间是否存在相同字符子串

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

vector<string> suffixtree(string s) {
	vector<string> vs(s.length());//用vs来保存这些元素
	for (int i = 0; i<s.length(); i++) {
		//依次将后i个元素放入vs中
		vs[i] = s.substr(s.length() - i - 1, i + 1);
	}
	//排序并返回
	sort(vs.begin(), vs.end());
	return vs;
}

string longcom(vector<string> vs) {
	int maxLen = 0;
	string ret;
	for (int i = 0; i<vs.size() - 1; i++) {
		string cur = vs[i];
		string suf = vs[i + 1];

		int tlen = 0;
		//循环条件是尚未到达任意一个的末尾
		for (int j = 0; j<min(cur.length(), suf.length()); j++) {
			//如果发现有不匹配,立刻退出循环,
			//如果是第一个元素就不匹配,那么没有必要匹配下去
			//如果是后面的元素不匹配,那么在上一次循环中已经设置了maxLen
			if (cur[j] != suf[j]) {
				tlen = 0;
				break;
			}
			else if (cur[j] == suf[j]) {
				tlen++;
			}
			//更新maxLen
			if (maxLen<tlen) {
				maxLen = tlen;
				ret = suf.substr(0, maxLen);
			}
		}
	}
	return ret;
}

int main()
{
	vector<string> vec = suffixtree( "xasdasdvdvdvd" );
	string str = longcom(vec);
	cout << str;
}


猜你喜欢

转载自blog.csdn.net/alatebloomer/article/details/80776126