生成子字符串

Generating Substring

本文关键字:字符串      更新时间:2023-10-16

我正在尝试生成所有子字符串并将其存储在动态分配的字符串数组中,如下所示:

  cin>>N;
  string str;
  cin>>str;
  ll m=N*(N+1)/2;
  string *sub = new string[m];
  int k=0;
  for(int i=1,k=0; i<=N; i++,k++)
  {
      for(int j=0; j+i<=N; j++,k++)
        {
         sub[k]=str.substr(j,i);
         cout<<sub[k]<<' ';
        }
  }

但是下面的代码在生成所有大小不超过 3 的字符串后给出错误

但是,当我不存储字符串时,我打印所有子字符串时,代码会给出所需的输出。(根据以下代码)

cin>>N;
  string str;
  cin>>str;
  ll m=N*(N+1)/2;
  string *sub = new string[m];
  int k=0;
  for(int i=1,k=0; i<=N; i++,k++)
  {
      for(int j=0; j+i<=N; j++,k++)
        {
         cout<<str.substr(j,i);
        }
  }

请帮忙??

k

增量太多:

for(int i=1,k=0; i<=N; i++,k++) // <==
{
    for(int j=0; j+i<=N; j++,k++)
    {

您只想在每次向数组添加内容时递增k,这只发生在内部循环中。按原样,您在每个主要循环中都会执行额外的增量,因此您将离开阵列的末端。

要避免此问题,您可以执行以下操作:

std::vector<std::string> subs;
subs.reserve(m);
for (int i=1; i<=N; ++i) {
    for (int j=0; i+j<=N; ++j) {
        subs.push_back(str.substr(j, i));
    }
}