Pular para o conteudo principal

Palíndromo válido

Como perceber que o problema pede comparação simetrica e não uma pilha de etapas desnecessarias.

Dada uma string s, retorne true se ela for um palindromo considerando apenas caracteres alfanumericos e ignorando diferencas entre maiusculas e minusculas.

Exemplo:

Input:  s = "A man, a plan, a canal: Panama"
Output: true

O que perceber antes de codar

Erros comuns

Passo 1 — Entender o que deve ser ignorado

Se você comparar a string crua, vai errar.

O problema manda ignorar:

  • espacos
  • pontuacao
  • diferença entre maiusculas e minusculas

Entao a pergunta real não e "a string original e igual ao reverso?".

A pergunta real e:

depois de ignorar o que não importa, o início bate com o fim?

Passo 2 — Escrever a primeira versão correta

Uma versão inicial simples e montar uma versão limpa da string e comparar com o reverso:

export function isPalindrome(s: string): boolean {
  const cleaned = s.toLowerCase().replace(/[^a-z0-9]/g, '')

  return cleaned === cleaned.split('').reverse().join('')
}

Funciona. Mas cria uma string nova e ainda cria outra para o reverso.

Passo 3 — Perguntar o que realmente precisa ser comparado

Palindromo e sempre comparação simetrica:

  • primeiro com ultimo
  • segundo com penultimo
  • e assim por diante

Isso já sugere dois ponteiros.

Passo 4 — Limpar sob demanda

Em vez de limpar tudo antes, você pode pular caracteres inválidos na hora.

Assim:

  • left anda para a direita
  • right anda para a esquerda
  • ambos ignoram o que não for alfanumerico
  • quando param, você compara os dois

O editor interativo precisa de JavaScript. Voce ainda pode ler o desafio e copiar o codigo inicial abaixo.

Codigo inicial

export function isPalindrome(s: string): boolean {
  // sua solução aqui
  return false
}
solution.ts
Travado? Dicas disponiveis.

Ainda não resolveu?

Ver a solução agora pode reduzir o aprendizado. Vale a pena tentar mais um pouco.

Abrir a solucao de referencia

Sem JavaScript, a solucao de referencia aparece inline em vez de um dialogo.

Solução

Complexidade final

Tempo: O(n)

Espaço: O(1)

Solução 1 — Limpar e comparar O(n) com memória extra

Essa e uma boa versão inicial.

export function isPalindrome(s: string): boolean {
  const cleaned = s.toLowerCase().replace(/[^a-z0-9]/g, '')

  return cleaned === cleaned.split('').reverse().join('')
}

Simples. Mas usa memória desnecessaria.

Solução 2 — Dois ponteiros O(n) e O(1) de memória extra

Se a comparação e do lado de fora para dentro, use dois ponteiros e pule o que não interessa.

function isAlphaNumeric(char: string): boolean {
  return /[a-z0-9]/i.test(char)
}

export function isPalindrome(s: string): boolean {
  let left = 0
  let right = s.length - 1

  while (left < right) {
    while (left < right && !isAlphaNumeric(s[left])) {
      left += 1
    }

    while (left < right && !isAlphaNumeric(s[right])) {
      right -= 1
    }

    if (s[left].toLowerCase() !== s[right].toLowerCase()) {
      return false
    }

    left += 1
    right -= 1
  }

  return true
}

Você compara só o que importa e usa a própria string original como fonte.

O que dizer na entrevista

Uma explicação curta e boa seria:

A versão inicial limpa a string e compara com o reverso, o que funciona em O(n) mas usa memória extra. Como palindromo e uma comparação simetrica, eu posso usar dois ponteiros, pular caracteres inválidos na hora e manter O(1) de memória extra.

Isso mostra que você:

  • entendeu a versão simples primeiro
  • transformou a regra do problema em movimento de ponteiros
  • justificou a melhora sem complicar a implementação

Quando esse padrão aparece de novo

Esse padrão reaparece quando você precisa:

  • comparar extremos
  • caminhar para o centro
  • ignorar parte da entrada durante a leitura
  • validar simetria sem criar estruturas novas

O ponto não e decorar “palindromo = dois ponteiros”.

O ponto e perceber quando o problema já te empurra para comparar bordas.

Proximo desafio Parênteses válidos Desafio anterior Anagrama válido

Desafios relacionados

Artigos relacionados