思路:对源字符串所有后缀的所有子串,从每一个后缀的最长子串开始,分别从前向和后向开始在源字符串中查找匹配的子串,若两次查找位置不一致则说明存在重复的长度最长的字串,并返回前向查找时的位置。
e.g.
string = “abcedfghiabckl‘,当使用子串”abc“在源字符串中分别前向和后向匹配时,找到的位置分别为pos1=0, pos2 = 9.
//求一个字符串中出现的相同且长度最长的字符串
pair<string, int> func2(string str)
{
string strTemp;
int i, j;
int iLen = str.length();
for (i = 0; i < iLen; i++)
{
for (j = iLen; j > 1; j--) //从每个后缀的最长子串开始
{
if (i + j <= iLen) //确保获取子串不会越界
{
size_t pos1, pos2;
strTemp = str.substr(i, j);
pos1 = str.find(strTemp);
pos2 = str.rfind(strTemp);
if (pos1 != pos2) //位置不一致则说明存在重复子串
{
return make_pair(strTemp, pos1 + 1);
}
}
}
}
return make_pair("", -1);
}