C++ - 单词中最长的回文前缀

C++ - Longest palindromic prefix in the word

我是C++的初学者,所以这可能是一个愚蠢的错误。因此,我编写了以下代码来查找任何单词中最长的回文:

#include<bits/stdc++.h>
#include<string>
using namespace std;

bool IsPal(string str)
{ 
  int length = str.length();
  if (length < 1) return true;
  else if (str.at(0) == str.at(length-1)) {str = str.substr(1, (length-2)); return IsPal(str);}
  else return false;
}

int main()
{
  int n;
  cin >> n;

  string x;
  int *arRes = new int[n];

  for (int i = 0; i < n; i++)
  {
    unsigned int maxim = 1;
    cin >> x;

    for (int j = 0; j < n; j++)
    {
      string sub = x.substr(0, j);

      if(IsPal(sub))
      {
        if(sub.length() > maxim)
        { maxim = sub.length(); }
      }
    }
    
    arRes[i] = maxim;  
  }
  for (int i = 0; i < n; i++)
  {
    cout << arRes[i] << endl; 
  }
  delete [] arRes;
}

它没有通过这个测试:

8
woweffect
abccbaabc
testme
strstr
ababab
abcdefg
tetatet
aaaaaaaaaaaaa

它打印 3 6 1 1 5 1 7 7 而不是 3 6 1 1 5 1 7 13 我不明白为什么。有人可以解释一下吗?

这里

for (int j = 0; j < n; j++)
    {
      string sub = x.substr(0, j);

您正在获取输入字符串的子字符串,从第一个字符开始到第 j 个,j0n

但是,n 是测试用例的数量,在您的示例中为 8(由于 j < n,输出为 7)。您可能希望 j0 循环到 x.size()

使用实际赋予变量有意义的名称的变量名称有助于避免这个问题和无数其他问题。例如 number_of_test_cases 而不是 n。然后再次阅读相同的代码:

for (int sub_string_size = 0; sub_string_size < number_of_test_cases; sub_string_size++)
    {
      string sub = x.substr(0, sub_string_size);