字符串中连续最多的子串

Posted ranran1203

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串中连续最多的子串相关的知识,希望对你有一定的参考价值。

把字符串用后缀树的形式表现出来如下:

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;
}

以上是关于字符串中连续最多的子串的主要内容,如果未能解决你的问题,请参考以下文章

字符串中连续最多的子串

求字符串中出现次数最多的子串及其出现次数

hihocoder-1419 后缀数组四·重复旋律4 求连续重复次数最多的子串

寻找一个字符串中连续出现次数最多的子串(面试宝典14.5节面试题1)

寻找一个字符串中连续出现次数最多的子串(面试宝典14.5节面试题1)

找出字符串中连续出现次数最多的子串