/*
字符串中重复出现的最长字串MaxlenRepeatSubString.cpp
shanghai zilaishui laizi haishanghai
output:shanghai
@author arhaiyun
date:2013/09/23
*/
#include "stdafx.h"
#include<iostream>
#include<string>
#include <algorithm>
using namespace std;
int strPreCommonLen(string str1,string str2)//求两个字符串最长公共前缀长度
{
int len = (str1.length() > str2.length()) ? str2.length() : str1.length();
int i=0;
while(i < len && str1[i]==str2[i])
i++;
return i;
}
string MaxlenRepeatSubString(string str,string &key)//求字符串str的最长重复字串,key是用来存放前缀的
{
int len = str.length();
string *sub= new string[len];//定义一个字符串数据存放后缀字符串
for(int i=0;i<len;i++)
{
sub[i] = str.substr(i,len-1);
}
std::sort(sub,sub+len);//对后缀字符串进行排序
int max = 1;
for(int i = 1;i < len;i++)
{
int count = strPreCommonLen(sub[i], sub[i-1]);//计算相邻的字符串的公共前缀长度
if(max < count)//如果当前长度大于最大长度,那么更新max和key
{
key = sub[i].substr(0,count);
max = count;
}
}
return key;
}
int main()
{
string str = "shanghai zilaishui laizi haishanghai";
string key = "ab";
MaxlenRepeatSubString(str,key);
cout<<key<<endl;
system("pause");
return 0;
}
字符串中重复出现的最长字串-后缀树思想
最新推荐文章于 2022-09-30 16:33:48 发布