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....
Naldo parabéns pelo blog, queria te mandar um e-mail não encontrei em nenhum lugar.
ResponderExcluirQuero tirar uma dúvida que não tem a ver com esse post, é a seguinte:
Qual a diferença em usar a função ASCAN do advpl ou procurar o que eu quero utilizando laço FOR?
Essa função tem alguma mágica, é mais rápida?
Jackson,
ExcluirNas aulas que ministro costumo mostrar, usando AdvPL, uma simulação do funcionamento das funções aEval e aSort... Vou montar um exemplo da aScan e publicar.
Mas uma afirmativa é certa: Utilize aScan, vai rodar em C++, no server, muito mais rápida do que um laço For/Next.
Como exemplo:
#include "rwmake.ch"
#include "protheus.ch"
#xtranslate MsgOut([]) => (ConOut([]),MsgBox([]))
//-----------------------------------------------------------------------------
//BlackTDN :: Simulando aSort e aEval
//-----------------------------------------------------------------------------
User Function aOrdena()
Local aArray := {10,9,7,4,3,2,5,6,78,89,0,43,2,4,65}
Local aCopy := aClone(aArray)
Local cMsg := ""
Local cCRLF := CRLF
//-----------------------------------------------------------------------------
//Usando a funcao padrao
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Função aEval() : http://tdn.totvs.com/display/tec/AEVal
//-----------------------------------------------------------------------------
aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Não Ordenado"),"INFO")
cMsg := ""
//-----------------------------------------------------------------------------
//Função aSort() : http://tdn.totvs.com/pages/viewpage.action?pageId=23889126
//-----------------------------------------------------------------------------
aSort(aArray,NIL,NIL,{|nMenor,nMaior|nMenornMaior})
aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Ordem Decrescente"),"INFO")
cMsg := ""
//-----------------------------------------------------------------------------
//Usando a funcao customizada
//-----------------------------------------------------------------------------
aSize(aArray,0)
__aEval(aCopy,{|e|aAdd(aArray,e)})
__aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
MsgOut(cMsg,OemToAnsi("Eval|aSort Padrão: Resultado Não Ordenado"),"INFO")
cMsg := ""
__aSort(aArray,NIL,NIL,{|nMenor,nMaior|nMenornMaior})
__aEval(aArray,{|nValor|cMsg+=Str(nValor)+cCRLF})
MsgOut(cMsg,OemToAnsi("__aEval|__aSort Customizadas : Resultado Ordem Decrescente"),"INFO")
cMsg := ""
Return(NIL)
//-----------------------------------------------------------------------------
//Simulando aSort padrao
//-----------------------------------------------------------------------------
Static Function __aSort(aArray,nStart,nCount,bEval)
Local nD
Local nJ
Local uTmp
DEFAULT nStart := 1
DEFAULT nCount := Len( aArray )
For nD := nStart To nCount
For nJ := nD To nCount
IF Eval(bEval,aArray[nJ],aArray[nD])
uTmp := aArray[nD]
aArray[nD] := aArray[nJ]
aArray[nJ] := uTmp
EndIF
Next nJ
Next nI
Return(aArray)
//-----------------------------------------------------------------------------
//Simulando aEval padrao
//-----------------------------------------------------------------------------
Static Function __aEval(aArray,bEval,nStart,nCount)
Local nD
Local nJ
DEFAULT nStart := 1
DEFAULT nCount := Len(aArray)
nJ := nCount
For nD := nStart To nJ
//Função Eval() :: http://tdn.totvs.com.br/pages/viewpage.action?pageId=24346635
Eval(bEval,aArray[nD],nD)
Next nD
Return(aArray)
Beleza Naldo obrigado!
ResponderExcluirVocê poderia montar um post com dicas sobre essas funções que são mais rápidas hein.. hehe
Valeu abs!