Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring

_Créditos das imagens: ChatGPT_ ### LeetCode :: Comparando Implementações Harbour e TLPP para o Desafio Longest Palindromic Substring Resolver o problema do [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/description/) é um exercício clássico de programação, que desafia desenvolvedores a encontrar a maior substring palindrômica dentro de uma string. Recentemente, exploramos soluções tanto em Harbour quanto em TLPP (Total Language Protheus Programming). Neste artigo, comparamos as implementações nessas duas linguagens, destacando suas semelhanças, diferenças e funcionalidades específicas. #### Implementações em Harbour ##### Versão 5.1 Essa solução utiliza a técnica de expansão a partir do centro do palíndromo. Cada caractere ou par de caracteres consecutivos é considerado um possível "centro". O algoritmo expande em ambas as direções enquanto os caracteres forem iguais, retornando o maior palíndromo encontrado. ##### Versão 5....

BlackTDN :: LeetCode :: Desafio 5: Longest Palindromic Substring - Soluções em Harbour e Considerações

_Créditos das imagens: ChatGPT_

### LeetCode :: Desafio 5: Longest Palindromic Substring - Soluções em Harbour e Considerações

Encontrar a maior substring palindrômica dentro de uma string é um problema clássico de programação e lógica. [No desafio 5 do LeetCode](https://leetcode.com/problems/longest-palindromic-substring/description/) , abordamos esse problema implementando duas soluções distintas na linguagem Harbour. Este artigo apresenta uma análise detalhada das técnicas utilizadas, os resultados obtidos e comparações entre as abordagens.

#### Resumo do Problema
Um palíndromo é uma sequência de caracteres que pode ser lida da mesma forma de trás para frente. O objetivo do desafio é identificar a maior substring que seja um palíndromo dentro de uma string fornecida.

#### Código-Fonte
As implementações podem ser encontradas nos links abaixo:

- [Versão 5.1](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/005/longest_palindromic_substring.5.1.prg)
- [Versão 5.2](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/005/longest_palindromic_substring.5.2.prg)

#### Detalhes das Implementações
##### Versão 5.1
A abordagem da versão 5.1 utiliza uma verificação expandindo para fora de cada caractere ou par de caracteres ("centro do palíndromo"). Essa técnica permite explorar todas as possibilidades e encontrar substrings palindrômicas em tempo aceitável para entradas de tamanho moderado. Essa implementação:

- Verifica cada caractere e pares consecutivos como possíveis centros de palíndromos.
- Expande a verificação para os dois lados enquanto os caracteres forem iguais.
- Retorna o maior palíndromo encontrado.

##### Versão 5.2
A versão 5.2 utiliza o algoritmo de Manacher, uma técnica mais avançada e eficiente para encontrar a maior substring palindrômica em tempo linear. Além disso, essa versão também inclui o código da abordagem 5.1 para fins de comparação de resultados. Essa implementação:

- Garante maior eficiência em strings de grande tamanho.
- Fornece uma base mais robusta para analisar e validar os resultados da abordagem centrada.

#### Comparação entre as Abordagens
- **Eficiência**: A versão 5.2, que utiliza o algoritmo de Manacher, é significativamente mais rápida para strings grandes, pois opera em tempo linear. A versão 5.1 apresenta bom desempenho em strings moderadas, mas escala pior para entradas maiores devido à sua complexidade quadrática.
- **Simplicidade**: A versão 5.1 é mais intuitiva e fácil de implementar, ideal para quem está começando a explorar o problema. A versão 5.2 requer mais entendimento sobre algoritmos sofisticados.
- **Resultados adicionais**: Ambas as versões foram estendidas para não apenas encontrar o maior palíndromo, mas também identificar todas as substrings palindrômicas dentro da string.

#### Exemplos de Saída
Além de atender aos requisitos do desafio, os programas foram aprimorados para listar todas as palindromias possíveis dentro de uma palavra ou frase. Por exemplo:

1. Entrada: "Um relatório omissíssimo em vários pontos importantes."
   - Palíndromos: ["omississimo", "mississim", "ississi", "ssiss", "issi", "ss"]

2. Entrada: "Viajar para a cidade natal faz muitos reviverem memórias antigas."
   - Palíndromos: ["aja", "ara", "dad", "ata", "reviver", "evive", "viv", "ere", "mem"]
3. Outros Exemplos
```

+--------------------------------------------------------------------+-----------------------------------------------------------------------+
| Entrada                                                            | Palíndromos                                                           |
+--------------------------------------------------------------------+-----------------------------------------------------------------------+
| babad                                                              | ["bab", "aba"]                                                        |
| cbbd                                                               | ["bb"]                                                                |
| A Aia cuidava das crianças com dedicação.                          | ["Aia", "ava", "ded", "cac", "aca"]                                   |
| Quem tem aibofobia sente medo de palíndromos.                      | ["aibofobia", "ibofobi", "bofob", "ofo", "omo"]                       |
| A ala esquerda do prédio foi reformada.                            | ["ala", "ada"]                                                        |
| Ele ama viajar para lugares tranquilos.                            | ["Ele", "ama", "aja", "ara"]                                          |
| A cor foi obtida com anilina natural.                              | ["anilina", "nilin", "ili"]                                           |
| A ata da reunião foi enviada a todos os participantes.             | ["ata", "ada", "odo", "ici"]                                          |
| A arara azul é uma ave belíssima.                                  | ["arara", "rar", "ara", "issi", "ss"]                                 |
| O avião perdeu uma asa no acidente.                                | ["asa"]                                                               |
| Ele sempre está disposto a ajudar.                                 | ["Ele"]                                                               |
| Esse livro é um dos meus favoritos.                                | ["Esse", "ss"]                                                        |
| Os bebês mamam para se alimentar.                                  | ["beb", "ebe", "mamam", "ama", "mam", "ara"]                          |
| As ondas fortes matam muitos animais marinhos.                     | ["matam", "ata"]                                                      |
| Eles sempre metem o nariz onde não são chamados.                   | ["Ele", "metem", "ete", "ama"]                                        |
| O time mirim venceu o campeonato regional.                         | ["mirim", "iri"]                                                      |
| Um relatório omissíssimo em vários pontos importantes.             | ["omississimo", "mississim", "ississi", "ssiss", "issi", "ss"]        |
| Viajar para a cidade natal faz muitos reviverem memórias antigas.  | ["aja", "ara", "dad", "ata", "reviver", "evive", "viv", "ere", "mem"] |
| A discussão acalorada terminou em sopapos.                         | ["ss", "aca", "ada", "sopapos", "opapo", "pap"]                       |
+--------------------------------------------------------------------+-----------------------------------------------------------------------+ 

```

#### Conclusão
Ambas as soluções atendem plenamente aos requisitos do desafio, identificando a maior substring palindrômica. Além disso, ao listar todas as substrings palindrômicas, oferecem insights adicionais que podem ser úteis em aplicações práticas. A inclusão do algoritmo de Manacher na versão 5.2 permite explorar os limites do problema com eficiência e precisão.

Uma versão implementada em AdvPL/TLPP estará disponível em breve, ampliando o acesso à solução para diferentes comunidades de desenvolvedores.

#### Referências
- [Código-Fonte Versão 5.1](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/005/longest_palindromic_substring.5.1.prg)
- [Código-Fonte Versão 5.2](https://github.com/naldodj/naldodj-xbase-leetcode-solutions/blob/main/src/hb/005/longest_palindromic_substring.5.2.prg)

#### Hashtags
#Palindromes #HarbourLanguage #AlgorithmDesign #LeetCodeSolutions #PalindromeSubstring #SoftwareDevelopment #ProgrammingChallenges #AdvPL #DynamicProgramming #CodeOptimization

Comentários

Postagens mais visitadas