标签:
把字符串用后缀树的形式表现出来如下:
a b c a b c a b c d e .substr[0]
b c a b c a b c d e ....substr[1]
c a b c a b c d e .......substr[2]
a b c a b c d e ..........substr[3]
b c a b c d e .............substr[4]
c a b c d e ...............substr[5]
a b c d e .................substr[6]
b c d e ...................substr[7]
c d e .....................substr[8]
d e ........................substr[9]
e ..........................substr[10]
可以观察到,若存在连续出现的字串,则满足 substr[0].substr(i,j-i) == substr[j].substr(0,j-i),例如上例中的
substr[0].substr(0,3-0) == substr[3].substr(0,3-0)
我们换一种方式来看,不需要生成后缀组,但思想还是一样的。
代码:
代码中str.substr(pos2,offset)其实相当于后缀组的substr[pos2].substr(0,offset)
把字符串写成后缀组其实相当于站在不同的位置往后看这个数组,所以其实并不需要额外增加存储空间来生成后缀组。
程序:
pair<int, string>fun(const string &str)
{
vector<string> substrs;
int maxcount = 1;
nt count = 1;
string substr;
int i;
int len = str.length();
for (i = 0; i < len; i++)
substrs.push_back(str.substr(i, len));//产生后缀子串
for (i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
count = 1;
if (substrs[i].substr(0, j - i) == substrs[j].substr(0, j - i))//offet 为j-i
{
count++;
for (int k = j + j - i; k < len; k++)//以offet为单位,进行查找,不连续就退出
{
if (substrs[i].substr(0, j - i) == substrs[k].substr(0, j - i))
count++;
else//不连续就退出
break;
}
if (count > maxcount)
{
maxcount = count;
substr = substrs[i].substr(0, j - i);
}
}
}
}
return make_pair(maxcount, substr);
}
int main()
{
string str="abcabcabccc";
pair<int, string> res;
res = fun(str);
cout << res.first << " " << res.second;
cin.get();
return 0;
}
标签:
原文地址:http://www.cnblogs.com/ranranblog/p/5616619.html