Solução Informática Iniciante – Semana 51 – Problema 1

por

Solução por Lúcio Cardoso

Para checar se uma string $$S$$ qualquer é um palíndromo, basta checar se o caractere de cada posição $$i$$ em $$S$$ é igual ao caractere na mesma posição $$i$$ da string reversa de $$S$$. Logo, é possível realizar a checagem em $$O(N)$$, onde $$N$$ é o tamanho da string.

Pela definição do problema, queremos encontrar a maior substring (string formada por posições consecutivas da palavra original) que é um palíndromo. Podemos então checar todas as $$O(n^2)$$ substrings com o algoritmo descrito acima em $$O(n)$$, atualizando a maior resposta caso a substring seja um palíndromo. A complexidade final será então $$O(n^3)$$.

Confira o código abaixo para melhor entendimento:


// Noic – Iniciante – Semana 51 – Problema 1
// Complexidade: O(n^3)
#include <bits/stdc++.h>
using namespace std;
string s;
bool check(int a, int b)
{
// substring de [a..b] e sua reversa
string S, R;
for (int i = a; i <= b; i++)
{
S.push_back(s[i]);
R.push_back(s[i]);
}
reverse(R.begin(), R.end());
for (int i = 0; i < S.size(); i++)
if (S[i] != R[i])
return false;
return true;
}
int main(void)
{
cin >> s;
int ans = 0;
for (int i = 0; i < s.size(); i++)
{
for (int j = i; j < s.size(); j++)
{
if (check(i, j))
{
// se a substring [i..j] for um palíndromo,
// atualizamos nossa resposta
ans = max(ans, j-i+1);
}
}
}
cout << ans << "\n";
}

Comentários

Comente