Longest palindromic
subsequence
Marcos Castro
Palíndromo
• Palíndromo é uma palavra que é lida da mesma forma da esquerda
para a direita e vice-versa.
• Exemplos de palíndromos: ANA, ATTA
2
Longest palindromic subsequence
• Longest palindromic subsequence = LPS
• Mais longa subsequência que é um palíndromo.
• Subsequência: não necessariamente contígua.
• Exemplo de sequência: ATCATA
• LPS: ATCTA, ATATA
• Tamanho do LPS: 5
3
Longest palindromic subsequence
• Abordagem custosa:
• Sobreposição de subproblemas.
• Faz o recálculo de subproblemas.
• É lento (complexidade exponencial).
• Vídeo-aula explicando essa abordagem: https://goo.gl/pNZ5bt
• Nesses slides abordaremos esse problema de forma mais eficiente, utilizando
programação dinâmica.
• Com programação dinâmica, conseguiremos sair de uma complexidade
exponencial para quadrática.
4
Longest palindromic subsequence
• Você já ouviu falar da LCS?
• LCS = longest common subsequence
• LPS é uma derivação do LCS.
• LCS é encontrar a subsequência que seja comum em ambas as strings
(não necessariamente contíguo).
• Pode-se encontrar o tamanho do LPS utilizando LCS, basta inverter a
string e fazer o LCS da string original com o da string invertida. Essa
solução também é quadrática: O(n^2).
• Vídeo aula sobre LCS: https://goo.gl/INau0Y
5
Longest palindromic subsequence
• Nessa apresentação será explicado um algoritmo baseado em
programação dinâmica para resolver o problema do LPS.
• Não iremos utilizar a abordagem para resolver o LCS.
• Nesse problema temos sobreposição de subproblemas.
• A programação dinâmica vai evitar o recálculo desses subproblemas.
• Iremos utilizar a abordagem bottom-up.
6
Longest palindromic subsequence
• String: ATCATA
• Resposta: 5 (tamanho do LPS).
• Seja N o tamanho da string, vamos construir uma matriz N x N.
7
Longest palindromic subsequence
8
A T C A T A
A
T
C
A
T
A
Como a nossa string é ATCATA (N = 6), construímos uma matriz 6x6
Longest palindromic subsequence
9
A T C A T A
A
T
C
A
T
A
Inicialmente consideramos strings de tamanho 1 (tam = 1)
Strings de tamanho 1 são palíndromos de tamanho 1
Basta fazer mat[i][i] = 1
Longest palindromic subsequence
10
A T C A T A
A 1
T 1
C 1
A 1
T 1
A 1
para i = 0 até N – 1
mat[i][i] = 1
Longest palindromic subsequence
11
A T C A T A
A 1
T 1
C 1
A 1
T 1
A 1
Agora iremos considerar strings de tamanho 2 (tam = 2)
Longest palindromic subsequence
12
A T C A T A
A 1
T 1
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
String original: ATCATA
Strings de tamanho 2: AT, TC, CA, AT, TA
Longest palindromic subsequence
13
A T C A T A
A 1 ?
T 1
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
Vamos preencher mat[0][1] representada pelo “?”
mat[0][1] representa a string AT
Longest palindromic subsequence
14
A T C A T A
A 1 ?
T 1
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[0][1] = AT, i = 0, j = 1
“A” é diferente de “T” (extremos), fazemos o max(mat[i][j-1], mat[i+1][j])
Longest palindromic subsequence
15
A T C A T A
A 1 ?
T 1
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[0][1] = AT
max(mat[0][0], mat[1][1]) = max(1, 1) = 1
Longest palindromic subsequence
16
A T C A T A
A 1 1
T 1 ?
C 1
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[1][2] = TC = ?
mat[1][2] = max(mat[1][1], mat[2][2]) = max(1, 1) = 1
Longest palindromic subsequence
17
A T C A T A
A 1 1
T 1 1
C 1 ?
A 1
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[2][3] = CA = ?
mat[2][3] = max(mat[2][2], mat[3][3]) = max(1, 1) = 1
Longest palindromic subsequence
18
A T C A T A
A 1 1
T 1 1
C 1 1
A 1 ?
T 1
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[3][4] = AT = ?
mat[3][4] = max(mat[3][3], mat[4][4]) = max(1, 1) = 1
Longest palindromic subsequence
19
A T C A T A
A 1 1
T 1 1
C 1 1
A 1 1
T 1 ?
A 1
Considerando strings de tamanho 2 (tam = 2)
mat[4][5] = TA = ?
mat[4][5] = max(mat[4][4], mat[5][5]) = max(1, 1) = 1
Longest palindromic subsequence
20
A T C A T A
A 1 1
T 1 1
C 1 1
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
String original: ATCATA
Strings de tamanho 3: ATC, TCA, CAT, ATA
Longest palindromic subsequence
21
A T C A T A
A 1 1 ?
T 1 1
C 1 1
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[0][2] = ATC = ?
“A” diferente de “C” (extremos)
Então faz max(mat[i][j-1],mat[i+1][j])
Longest palindromic subsequence
22
A T C A T A
A 1 1 ?
T 1 1
C 1 1
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[0][2] = ATC = ?
max(mat[0][1], mat[1][2]) = max(1, 1) = 1
Longest palindromic subsequence
23
A T C A T A
A 1 1 1
T 1 1 ?
C 1 1
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[1][3] = TCA= ?
mat[1][3] = max(mat[1][2], mat[2][3]) = max(1, 1) = 1
Longest palindromic subsequence
24
A T C A T A
A 1 1 1
T 1 1 1
C 1 1 ?
A 1 1
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[2][4] = CAT = ?
mat[2][4] = max(mat[2][3], mat[1][4]) = max(1, 1) = 1
Longest palindromic subsequence
25
A T C A T A
A 1 1 1
T 1 1 1
C 1 1 1
A 1 1 ?
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[3][5] = ATA= ?
Opa, agora “A” == “A” (extremos)
mat[i][j] = mat[i+1][j-1] + 2
Longest palindromic subsequence
26
A T C A T A
A 1 1 1
T 1 1 1
C 1 1 1
A 1 1 ?
T 1 1
A 1
Considerando strings de tamanho 3 (tam = 3)
mat[3][5] = ATA= ?
mat[i][j] = mat[i+1][j-1] + 2
mat[3][5] = mat[4][4] + 2 = 1 + 2 = 3
Longest palindromic subsequence
27
A T C A T A
A 1 1 1
T 1 1 1
C 1 1 1
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 4 (tam = 4)
String original: ATCATA
Strings de tamanho 4: ATCA, TCAT, CATA
Longest palindromic subsequence
28
A T C A T A
A 1 1 1 ?
T 1 1 1
C 1 1 1
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 4 (tam = 4)
mat[0][3] = ATCA
“A” é igual a “A” (extremos)
mat[0][3] = mat[1][2] + 2 = 1 + 2 = 3
Longest palindromic subsequence
29
A T C A T A
A 1 1 1 3
T 1 1 1 ?
C 1 1 1
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 4 (tam = 4)
mat[1][4] = TCAT
“T” é igual a “T” (extremos)
mat[1][4] = mat[2][3] + 2 = 1 + 2 = 3
Longest palindromic subsequence
30
A T C A T A
A 1 1 1 3
T 1 1 1 3
C 1 1 1 ?
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 4 (tam = 4)
mat[2][5] = CATA
“C” é diferente de “A” (extremos)
mat[2][5] = max(mat[2][4], mat[3][5]) = max(1, 3) = 3
Longest palindromic subsequence
31
A T C A T A
A 1 1 1 3
T 1 1 1 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 5 (tam = 5)
String original: ATCATA
Strings de tamanho 5: ATCAT, TCATA
Longest palindromic subsequence
32
A T C A T A
A 1 1 1 3 ?
T 1 1 1 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 5 (tam = 5)
mat[0][4] = ATCAT = ?
“A” é diferente de “T”
mat[0][4] = max(mat[0][3], mat[1][4]) = max(3, 3) = 3
Longest palindromic subsequence
33
A T C A T A
A 1 1 1 3 3
T 1 1 1 3 ?
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 5 (tam = 5)
mat[1][5] = TCATA = ?
“T” é diferente de “A”
mat[1][5] = max(mat[1][4], mat[2][5]) = max(3, 3) = 3
Longest palindromic subsequence
34
A T C A T A
A 1 1 1 3 3
T 1 1 1 3 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 6 (tam = 6)
Só temos uma string de tamanho 6: ATCATA
Longest palindromic subsequence
35
A T C A T A
A 1 1 1 3 3 ?
T 1 1 1 3 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 6 (tam = 6)
mat[0][5] = ?
Veja só, mat[0][5] é mat[0][N-1] onde “N” é o tamanho da string original
A nossa resposta está em mat[0][N-1]
Longest palindromic subsequence
36
A T C A T A
A 1 1 1 3 3 ?
T 1 1 1 3 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
Considerando strings de tamanho 6 (tam = 6)
mat[0][5] = ATCATA = ?
“A” é igual a “A”
mat[0][5] = mat[1][4] + 2 = 3 + 2 = 5
Longest palindromic subsequence
37
A T C A T A
A 1 1 1 3 3 5
T 1 1 1 3 3
C 1 1 1 3
A 1 1 3
T 1 1
A 1
mat[0][5] = mat[0][N-1] = 5
Tamanho do LPS: 5
Longest palindromic subsequence
• Implementação em C++:
• https://goo.gl/bQZuXO
• Vídeo-aula explicando essa apresentação:
• https://youtu.be/fMwNCE1HhJE
• Curso de C++ (mais de 100 vídeo-aulas):
• https://goo.gl/NjdLGH
• Problema de maratona de programação:
• https://www.urionlinejudge.com.br/judge/pt/problems/view/1941
38
Dúvidas?
mcastrosouza@live.com
www.geeksbr.com
twitter.com/mcastrosouza
39

Longest palindromic subsequence (LPS)

  • 1.
  • 2.
    Palíndromo • Palíndromo éuma palavra que é lida da mesma forma da esquerda para a direita e vice-versa. • Exemplos de palíndromos: ANA, ATTA 2
  • 3.
    Longest palindromic subsequence •Longest palindromic subsequence = LPS • Mais longa subsequência que é um palíndromo. • Subsequência: não necessariamente contígua. • Exemplo de sequência: ATCATA • LPS: ATCTA, ATATA • Tamanho do LPS: 5 3
  • 4.
    Longest palindromic subsequence •Abordagem custosa: • Sobreposição de subproblemas. • Faz o recálculo de subproblemas. • É lento (complexidade exponencial). • Vídeo-aula explicando essa abordagem: https://goo.gl/pNZ5bt • Nesses slides abordaremos esse problema de forma mais eficiente, utilizando programação dinâmica. • Com programação dinâmica, conseguiremos sair de uma complexidade exponencial para quadrática. 4
  • 5.
    Longest palindromic subsequence •Você já ouviu falar da LCS? • LCS = longest common subsequence • LPS é uma derivação do LCS. • LCS é encontrar a subsequência que seja comum em ambas as strings (não necessariamente contíguo). • Pode-se encontrar o tamanho do LPS utilizando LCS, basta inverter a string e fazer o LCS da string original com o da string invertida. Essa solução também é quadrática: O(n^2). • Vídeo aula sobre LCS: https://goo.gl/INau0Y 5
  • 6.
    Longest palindromic subsequence •Nessa apresentação será explicado um algoritmo baseado em programação dinâmica para resolver o problema do LPS. • Não iremos utilizar a abordagem para resolver o LCS. • Nesse problema temos sobreposição de subproblemas. • A programação dinâmica vai evitar o recálculo desses subproblemas. • Iremos utilizar a abordagem bottom-up. 6
  • 7.
    Longest palindromic subsequence •String: ATCATA • Resposta: 5 (tamanho do LPS). • Seja N o tamanho da string, vamos construir uma matriz N x N. 7
  • 8.
    Longest palindromic subsequence 8 AT C A T A A T C A T A Como a nossa string é ATCATA (N = 6), construímos uma matriz 6x6
  • 9.
    Longest palindromic subsequence 9 AT C A T A A T C A T A Inicialmente consideramos strings de tamanho 1 (tam = 1) Strings de tamanho 1 são palíndromos de tamanho 1 Basta fazer mat[i][i] = 1
  • 10.
    Longest palindromic subsequence 10 AT C A T A A 1 T 1 C 1 A 1 T 1 A 1 para i = 0 até N – 1 mat[i][i] = 1
  • 11.
    Longest palindromic subsequence 11 AT C A T A A 1 T 1 C 1 A 1 T 1 A 1 Agora iremos considerar strings de tamanho 2 (tam = 2)
  • 12.
    Longest palindromic subsequence 12 AT C A T A A 1 T 1 C 1 A 1 T 1 A 1 Considerando strings de tamanho 2 (tam = 2) String original: ATCATA Strings de tamanho 2: AT, TC, CA, AT, TA
  • 13.
    Longest palindromic subsequence 13 AT C A T A A 1 ? T 1 C 1 A 1 T 1 A 1 Considerando strings de tamanho 2 (tam = 2) Vamos preencher mat[0][1] representada pelo “?” mat[0][1] representa a string AT
  • 14.
    Longest palindromic subsequence 14 AT C A T A A 1 ? T 1 C 1 A 1 T 1 A 1 Considerando strings de tamanho 2 (tam = 2) mat[0][1] = AT, i = 0, j = 1 “A” é diferente de “T” (extremos), fazemos o max(mat[i][j-1], mat[i+1][j])
  • 15.
    Longest palindromic subsequence 15 AT C A T A A 1 ? T 1 C 1 A 1 T 1 A 1 Considerando strings de tamanho 2 (tam = 2) mat[0][1] = AT max(mat[0][0], mat[1][1]) = max(1, 1) = 1
  • 16.
    Longest palindromic subsequence 16 AT C A T A A 1 1 T 1 ? C 1 A 1 T 1 A 1 Considerando strings de tamanho 2 (tam = 2) mat[1][2] = TC = ? mat[1][2] = max(mat[1][1], mat[2][2]) = max(1, 1) = 1
  • 17.
    Longest palindromic subsequence 17 AT C A T A A 1 1 T 1 1 C 1 ? A 1 T 1 A 1 Considerando strings de tamanho 2 (tam = 2) mat[2][3] = CA = ? mat[2][3] = max(mat[2][2], mat[3][3]) = max(1, 1) = 1
  • 18.
    Longest palindromic subsequence 18 AT C A T A A 1 1 T 1 1 C 1 1 A 1 ? T 1 A 1 Considerando strings de tamanho 2 (tam = 2) mat[3][4] = AT = ? mat[3][4] = max(mat[3][3], mat[4][4]) = max(1, 1) = 1
  • 19.
    Longest palindromic subsequence 19 AT C A T A A 1 1 T 1 1 C 1 1 A 1 1 T 1 ? A 1 Considerando strings de tamanho 2 (tam = 2) mat[4][5] = TA = ? mat[4][5] = max(mat[4][4], mat[5][5]) = max(1, 1) = 1
  • 20.
    Longest palindromic subsequence 20 AT C A T A A 1 1 T 1 1 C 1 1 A 1 1 T 1 1 A 1 Considerando strings de tamanho 3 (tam = 3) String original: ATCATA Strings de tamanho 3: ATC, TCA, CAT, ATA
  • 21.
    Longest palindromic subsequence 21 AT C A T A A 1 1 ? T 1 1 C 1 1 A 1 1 T 1 1 A 1 Considerando strings de tamanho 3 (tam = 3) mat[0][2] = ATC = ? “A” diferente de “C” (extremos) Então faz max(mat[i][j-1],mat[i+1][j])
  • 22.
    Longest palindromic subsequence 22 AT C A T A A 1 1 ? T 1 1 C 1 1 A 1 1 T 1 1 A 1 Considerando strings de tamanho 3 (tam = 3) mat[0][2] = ATC = ? max(mat[0][1], mat[1][2]) = max(1, 1) = 1
  • 23.
    Longest palindromic subsequence 23 AT C A T A A 1 1 1 T 1 1 ? C 1 1 A 1 1 T 1 1 A 1 Considerando strings de tamanho 3 (tam = 3) mat[1][3] = TCA= ? mat[1][3] = max(mat[1][2], mat[2][3]) = max(1, 1) = 1
  • 24.
    Longest palindromic subsequence 24 AT C A T A A 1 1 1 T 1 1 1 C 1 1 ? A 1 1 T 1 1 A 1 Considerando strings de tamanho 3 (tam = 3) mat[2][4] = CAT = ? mat[2][4] = max(mat[2][3], mat[1][4]) = max(1, 1) = 1
  • 25.
    Longest palindromic subsequence 25 AT C A T A A 1 1 1 T 1 1 1 C 1 1 1 A 1 1 ? T 1 1 A 1 Considerando strings de tamanho 3 (tam = 3) mat[3][5] = ATA= ? Opa, agora “A” == “A” (extremos) mat[i][j] = mat[i+1][j-1] + 2
  • 26.
    Longest palindromic subsequence 26 AT C A T A A 1 1 1 T 1 1 1 C 1 1 1 A 1 1 ? T 1 1 A 1 Considerando strings de tamanho 3 (tam = 3) mat[3][5] = ATA= ? mat[i][j] = mat[i+1][j-1] + 2 mat[3][5] = mat[4][4] + 2 = 1 + 2 = 3
  • 27.
    Longest palindromic subsequence 27 AT C A T A A 1 1 1 T 1 1 1 C 1 1 1 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 4 (tam = 4) String original: ATCATA Strings de tamanho 4: ATCA, TCAT, CATA
  • 28.
    Longest palindromic subsequence 28 AT C A T A A 1 1 1 ? T 1 1 1 C 1 1 1 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 4 (tam = 4) mat[0][3] = ATCA “A” é igual a “A” (extremos) mat[0][3] = mat[1][2] + 2 = 1 + 2 = 3
  • 29.
    Longest palindromic subsequence 29 AT C A T A A 1 1 1 3 T 1 1 1 ? C 1 1 1 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 4 (tam = 4) mat[1][4] = TCAT “T” é igual a “T” (extremos) mat[1][4] = mat[2][3] + 2 = 1 + 2 = 3
  • 30.
    Longest palindromic subsequence 30 AT C A T A A 1 1 1 3 T 1 1 1 3 C 1 1 1 ? A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 4 (tam = 4) mat[2][5] = CATA “C” é diferente de “A” (extremos) mat[2][5] = max(mat[2][4], mat[3][5]) = max(1, 3) = 3
  • 31.
    Longest palindromic subsequence 31 AT C A T A A 1 1 1 3 T 1 1 1 3 C 1 1 1 3 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 5 (tam = 5) String original: ATCATA Strings de tamanho 5: ATCAT, TCATA
  • 32.
    Longest palindromic subsequence 32 AT C A T A A 1 1 1 3 ? T 1 1 1 3 C 1 1 1 3 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 5 (tam = 5) mat[0][4] = ATCAT = ? “A” é diferente de “T” mat[0][4] = max(mat[0][3], mat[1][4]) = max(3, 3) = 3
  • 33.
    Longest palindromic subsequence 33 AT C A T A A 1 1 1 3 3 T 1 1 1 3 ? C 1 1 1 3 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 5 (tam = 5) mat[1][5] = TCATA = ? “T” é diferente de “A” mat[1][5] = max(mat[1][4], mat[2][5]) = max(3, 3) = 3
  • 34.
    Longest palindromic subsequence 34 AT C A T A A 1 1 1 3 3 T 1 1 1 3 3 C 1 1 1 3 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 6 (tam = 6) Só temos uma string de tamanho 6: ATCATA
  • 35.
    Longest palindromic subsequence 35 AT C A T A A 1 1 1 3 3 ? T 1 1 1 3 3 C 1 1 1 3 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 6 (tam = 6) mat[0][5] = ? Veja só, mat[0][5] é mat[0][N-1] onde “N” é o tamanho da string original A nossa resposta está em mat[0][N-1]
  • 36.
    Longest palindromic subsequence 36 AT C A T A A 1 1 1 3 3 ? T 1 1 1 3 3 C 1 1 1 3 A 1 1 3 T 1 1 A 1 Considerando strings de tamanho 6 (tam = 6) mat[0][5] = ATCATA = ? “A” é igual a “A” mat[0][5] = mat[1][4] + 2 = 3 + 2 = 5
  • 37.
    Longest palindromic subsequence 37 AT C A T A A 1 1 1 3 3 5 T 1 1 1 3 3 C 1 1 1 3 A 1 1 3 T 1 1 A 1 mat[0][5] = mat[0][N-1] = 5 Tamanho do LPS: 5
  • 38.
    Longest palindromic subsequence •Implementação em C++: • https://goo.gl/bQZuXO • Vídeo-aula explicando essa apresentação: • https://youtu.be/fMwNCE1HhJE • Curso de C++ (mais de 100 vídeo-aulas): • https://goo.gl/NjdLGH • Problema de maratona de programação: • https://www.urionlinejudge.com.br/judge/pt/problems/view/1941 38
  • 39.