Я новичок в 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, и я не могу понять почему. Кто-нибудь может это объяснить?

0
Александр II 30 Ноя 2020 в 19:39

1 ответ

Лучший ответ

Вот

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

Вы берете подстроки входных строк, начиная с первого символа до j-го, а j идет от 0 до n.

Однако n - это количество тестовых примеров, которое в вашем примере равно 8 (вывод - 7 из-за j < n). Возможно, вы захотите, чтобы j вместо этого выполнялся в цикле от 0 до 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);
2
largest_prime_is_463035818 30 Ноя 2020 в 17:19