码迷,mamicode.com
首页 > 其他好文 > 详细

字符串中连续最多的子串

时间:2016-06-25 19:05:46      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

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

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!