SlideShare uma empresa Scribd logo
1 de 39
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

Mais conteúdo relacionado

Mais procurados

Aula 6 - Funções Exponenciais e Logarítmicas
Aula 6 - Funções Exponenciais e LogarítmicasAula 6 - Funções Exponenciais e Logarítmicas
Aula 6 - Funções Exponenciais e LogarítmicasTurma1NC
 
Linear Algebra - Vectors and Matrices
Linear Algebra - Vectors and MatricesLinear Algebra - Vectors and Matrices
Linear Algebra - Vectors and MatricesDiponegoro University
 
Aula Sobre Coordenadas Cartesianas
Aula Sobre Coordenadas CartesianasAula Sobre Coordenadas Cartesianas
Aula Sobre Coordenadas CartesianasAntonio Carneiro
 
Persamaan diferensial(differential equation
Persamaan diferensial(differential equationPersamaan diferensial(differential equation
Persamaan diferensial(differential equationartyudy
 
Pengantar matematika-diskrit
Pengantar matematika-diskritPengantar matematika-diskrit
Pengantar matematika-diskrittafrikan
 
Analisis Algoritma - Langkah Desain Algoritma
Analisis Algoritma - Langkah Desain AlgoritmaAnalisis Algoritma - Langkah Desain Algoritma
Analisis Algoritma - Langkah Desain AlgoritmaAdam Mukharil Bachtiar
 
Floyd Warshall algorithm easy way to compute - Malinga
Floyd Warshall algorithm easy way to compute - MalingaFloyd Warshall algorithm easy way to compute - Malinga
Floyd Warshall algorithm easy way to compute - MalingaMalinga Perera
 
Analisis Algoritma - Pengantar Kompleksitas Algoritma
Analisis Algoritma - Pengantar Kompleksitas AlgoritmaAnalisis Algoritma - Pengantar Kompleksitas Algoritma
Analisis Algoritma - Pengantar Kompleksitas AlgoritmaAdam Mukharil Bachtiar
 
matematika geodesi-transformasi linier
matematika geodesi-transformasi liniermatematika geodesi-transformasi linier
matematika geodesi-transformasi linieraulia rachmawati
 
pert7_8-fis-e28093-metode-sugeno.pptx
pert7_8-fis-e28093-metode-sugeno.pptxpert7_8-fis-e28093-metode-sugeno.pptx
pert7_8-fis-e28093-metode-sugeno.pptxValentino Selayan
 
2. Array of Record (Struktur Data)
2. Array of Record (Struktur Data)2. Array of Record (Struktur Data)
2. Array of Record (Struktur Data)Kelinci Coklat
 
Dijkstra’S Algorithm
Dijkstra’S AlgorithmDijkstra’S Algorithm
Dijkstra’S Algorithmami_01
 
Matemaika Diskrit - 04 induksi matematik - 03
Matemaika Diskrit - 04 induksi matematik - 03Matemaika Diskrit - 04 induksi matematik - 03
Matemaika Diskrit - 04 induksi matematik - 03KuliahKita
 
DAA-Floyd Warshall Algorithm.pptx
DAA-Floyd Warshall Algorithm.pptxDAA-Floyd Warshall Algorithm.pptx
DAA-Floyd Warshall Algorithm.pptxArbabMaalik
 
Analisis Algoritma - Pengantar Analisis Algoritma
Analisis Algoritma - Pengantar Analisis AlgoritmaAnalisis Algoritma - Pengantar Analisis Algoritma
Analisis Algoritma - Pengantar Analisis AlgoritmaAdam Mukharil Bachtiar
 
Transformasi linier " Matematika Geodesi "
Transformasi linier " Matematika Geodesi "Transformasi linier " Matematika Geodesi "
Transformasi linier " Matematika Geodesi "Dedy Kurniawan
 
LAPORAN HASIL PRAKTEK PEMROGRAMAN KOMPUTER (DLPHI 7)
LAPORAN HASIL PRAKTEK  PEMROGRAMAN KOMPUTER (DLPHI 7)LAPORAN HASIL PRAKTEK  PEMROGRAMAN KOMPUTER (DLPHI 7)
LAPORAN HASIL PRAKTEK PEMROGRAMAN KOMPUTER (DLPHI 7)YOHANIS SAHABAT
 

Mais procurados (20)

Aula 6 - Funções Exponenciais e Logarítmicas
Aula 6 - Funções Exponenciais e LogarítmicasAula 6 - Funções Exponenciais e Logarítmicas
Aula 6 - Funções Exponenciais e Logarítmicas
 
Linear Algebra - Vectors and Matrices
Linear Algebra - Vectors and MatricesLinear Algebra - Vectors and Matrices
Linear Algebra - Vectors and Matrices
 
Aula Sobre Coordenadas Cartesianas
Aula Sobre Coordenadas CartesianasAula Sobre Coordenadas Cartesianas
Aula Sobre Coordenadas Cartesianas
 
Persamaan diferensial(differential equation
Persamaan diferensial(differential equationPersamaan diferensial(differential equation
Persamaan diferensial(differential equation
 
Pengantar matematika-diskrit
Pengantar matematika-diskritPengantar matematika-diskrit
Pengantar matematika-diskrit
 
Analisis Algoritma - Langkah Desain Algoritma
Analisis Algoritma - Langkah Desain AlgoritmaAnalisis Algoritma - Langkah Desain Algoritma
Analisis Algoritma - Langkah Desain Algoritma
 
Floyd Warshall algorithm easy way to compute - Malinga
Floyd Warshall algorithm easy way to compute - MalingaFloyd Warshall algorithm easy way to compute - Malinga
Floyd Warshall algorithm easy way to compute - Malinga
 
Analisis Algoritma - Pengantar Kompleksitas Algoritma
Analisis Algoritma - Pengantar Kompleksitas AlgoritmaAnalisis Algoritma - Pengantar Kompleksitas Algoritma
Analisis Algoritma - Pengantar Kompleksitas Algoritma
 
matematika geodesi-transformasi linier
matematika geodesi-transformasi liniermatematika geodesi-transformasi linier
matematika geodesi-transformasi linier
 
pert7_8-fis-e28093-metode-sugeno.pptx
pert7_8-fis-e28093-metode-sugeno.pptxpert7_8-fis-e28093-metode-sugeno.pptx
pert7_8-fis-e28093-metode-sugeno.pptx
 
2. Array of Record (Struktur Data)
2. Array of Record (Struktur Data)2. Array of Record (Struktur Data)
2. Array of Record (Struktur Data)
 
Dijkstra’S Algorithm
Dijkstra’S AlgorithmDijkstra’S Algorithm
Dijkstra’S Algorithm
 
Matemaika Diskrit - 04 induksi matematik - 03
Matemaika Diskrit - 04 induksi matematik - 03Matemaika Diskrit - 04 induksi matematik - 03
Matemaika Diskrit - 04 induksi matematik - 03
 
DAA-Floyd Warshall Algorithm.pptx
DAA-Floyd Warshall Algorithm.pptxDAA-Floyd Warshall Algorithm.pptx
DAA-Floyd Warshall Algorithm.pptx
 
Analisis Algoritma - Pengantar Analisis Algoritma
Analisis Algoritma - Pengantar Analisis AlgoritmaAnalisis Algoritma - Pengantar Analisis Algoritma
Analisis Algoritma - Pengantar Analisis Algoritma
 
Bab 6
Bab 6Bab 6
Bab 6
 
Dijkstra
DijkstraDijkstra
Dijkstra
 
Transformasi linier " Matematika Geodesi "
Transformasi linier " Matematika Geodesi "Transformasi linier " Matematika Geodesi "
Transformasi linier " Matematika Geodesi "
 
Tree and graph
Tree and graphTree and graph
Tree and graph
 
LAPORAN HASIL PRAKTEK PEMROGRAMAN KOMPUTER (DLPHI 7)
LAPORAN HASIL PRAKTEK  PEMROGRAMAN KOMPUTER (DLPHI 7)LAPORAN HASIL PRAKTEK  PEMROGRAMAN KOMPUTER (DLPHI 7)
LAPORAN HASIL PRAKTEK PEMROGRAMAN KOMPUTER (DLPHI 7)
 

Mais de Marcos Castro

Árvores de Decisão
Árvores de DecisãoÁrvores de Decisão
Árvores de DecisãoMarcos Castro
 
Colored de Bruijn Graphs
Colored de Bruijn GraphsColored de Bruijn Graphs
Colored de Bruijn GraphsMarcos Castro
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de ProgramaçãoMarcos Castro
 
Ferramentas para Bioinformática
Ferramentas para BioinformáticaFerramentas para Bioinformática
Ferramentas para BioinformáticaMarcos Castro
 
A importância da Bioinformática
A importância da BioinformáticaA importância da Bioinformática
A importância da BioinformáticaMarcos Castro
 
Redes Neurais Artificiais
Redes Neurais ArtificiaisRedes Neurais Artificiais
Redes Neurais ArtificiaisMarcos Castro
 
Problema do Caixeiro Viajante
Problema do Caixeiro ViajanteProblema do Caixeiro Viajante
Problema do Caixeiro ViajanteMarcos Castro
 
Metaheurística Simulated Annealing
Metaheurística Simulated AnnealingMetaheurística Simulated Annealing
Metaheurística Simulated AnnealingMarcos Castro
 
Expressões Regulares com Python 3
Expressões Regulares com Python 3Expressões Regulares com Python 3
Expressões Regulares com Python 3Marcos Castro
 
Programação dinâmica
Programação dinâmicaProgramação dinâmica
Programação dinâmicaMarcos Castro
 
Busca em largura - BFS
Busca em largura - BFSBusca em largura - BFS
Busca em largura - BFSMarcos Castro
 
Análise Assintótica
Análise AssintóticaAnálise Assintótica
Análise AssintóticaMarcos Castro
 
Listas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosListas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosMarcos Castro
 
Python - Dicionários
Python - DicionáriosPython - Dicionários
Python - DicionáriosMarcos Castro
 

Mais de Marcos Castro (20)

Árvores de Decisão
Árvores de DecisãoÁrvores de Decisão
Árvores de Decisão
 
Colored de Bruijn Graphs
Colored de Bruijn GraphsColored de Bruijn Graphs
Colored de Bruijn Graphs
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de Programação
 
Bioinformática
BioinformáticaBioinformática
Bioinformática
 
Arquivos FASTQ
Arquivos FASTQArquivos FASTQ
Arquivos FASTQ
 
Ferramentas para Bioinformática
Ferramentas para BioinformáticaFerramentas para Bioinformática
Ferramentas para Bioinformática
 
A importância da Bioinformática
A importância da BioinformáticaA importância da Bioinformática
A importância da Bioinformática
 
Bioinformática
BioinformáticaBioinformática
Bioinformática
 
Redes Neurais Artificiais
Redes Neurais ArtificiaisRedes Neurais Artificiais
Redes Neurais Artificiais
 
Problema do Caixeiro Viajante
Problema do Caixeiro ViajanteProblema do Caixeiro Viajante
Problema do Caixeiro Viajante
 
Metaheurística Simulated Annealing
Metaheurística Simulated AnnealingMetaheurística Simulated Annealing
Metaheurística Simulated Annealing
 
Expressões Regulares com Python 3
Expressões Regulares com Python 3Expressões Regulares com Python 3
Expressões Regulares com Python 3
 
Algoritmos gulosos
Algoritmos gulososAlgoritmos gulosos
Algoritmos gulosos
 
Programação dinâmica
Programação dinâmicaProgramação dinâmica
Programação dinâmica
 
Busca em largura - BFS
Busca em largura - BFSBusca em largura - BFS
Busca em largura - BFS
 
Análise Assintótica
Análise AssintóticaAnálise Assintótica
Análise Assintótica
 
Listas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosListas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionários
 
Python - Set
Python - SetPython - Set
Python - Set
 
Python - Dicionários
Python - DicionáriosPython - Dicionários
Python - Dicionários
 
Tabela Hash
Tabela HashTabela Hash
Tabela Hash
 

Longest palindromic subsequence LPS

  • 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 A T 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 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
  • 10. 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
  • 11. 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)
  • 12. 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
  • 13. 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
  • 14. 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])
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. 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
  • 19. 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
  • 20. 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
  • 21. 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])
  • 22. 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
  • 23. 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
  • 24. 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
  • 25. 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
  • 26. 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
  • 27. 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
  • 28. 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
  • 29. 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
  • 30. 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
  • 31. 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
  • 32. 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
  • 33. 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
  • 34. 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
  • 35. 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]
  • 36. 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
  • 37. 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
  • 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