Dada uma string , eu gostaria de encontrar a subsequência mais repetida (pelo menos duas vezes). Ou seja, eu gostaria de encontrar uma string que seja uma subsequência (não precisa ser um contíguo) de tal que . Ou seja, é uma string cujas metades aparecem duas vezes seguidas. Observe que é uma subsequência de , mas não necessariamente uma substring.
Exemplos:
Para 'ababccabdc', será 'abcabc', porque 'abc' = 'abc' e 'abc' aparecem (pelo menos) duas vezes em 'ababccabdc'.
Para 'addbacddabcd', uma opção é 'dddd' porque 'dd' aparece duas vezes (não posso usar a mesma letra várias vezes, mas aqui tenho 4 'd, então está tudo bem), mas é de comprimento 4. Posso encontrar uma melhor de comprimento 8: 'abcdabcd', porque 'abcd' é uma substring de 'addbacddabcd' que aparece duas vezes.
Estou interessado em encontrar a subsequência de repetição mais longa. Isso também é chamado de "encontrar o quadrado maior / maior", mas li muitos artigos nos quais um quadrado é definido para uma substring e não para uma subsequência.
Posso usar facilmente um algoritmo de força bruta que aceitará iterando todas as opções para um ponto de interrupção na string e, em seguida, terei duas strings nas quais procurarei a maior / maior subsequência comum, mas cada verificação terá usando uma técnica de programação dinâmica; portanto, o tempo todo será . Eu encontrei um algoritmo mais eficiente para a subsequência comum mais longa que leva , portanto o tempo de execução será .
Estou procurando um algoritmo mais eficiente para o problema de subsequência de repetição mais longo. Talvez minha ideia de iterar em todos os pontos de interrupção desperdice muito tempo e possa ser reduzida a menos iterações. Ou talvez um algoritmo com uma atitude diferente possa resolver esse problema.
Eu pesquisei em várias revistas e perguntas anteriores, e a maioria dos resultados encontrados foram sobre uma substring e não sobre uma subsequência.
Também li que isso pode ser feito usando árvores de sufixo, mas isso também é relevante para substrings e não tenho certeza se essa ideia pode ser estendida para subsequência.
Estou procurando uma solução que seja executada no tempo . Se existir um em isso será ainda melhor (não tenho certeza se existe).
$
Respostas:
Aqui está uma solução de programação dinâmica.
Suponha que a sequência de entrada seja . Crie uma tabela cujas linhas e colunas sejam indexadas por (onde é o comprimento da sequência), preenchido pela regra A resposta é .x1…xn T 0,…,n n
fonte
if
dp[i][j] = dp[i - 1][j - 1] + 1