Seja um alfabeto e sejam cadeias de caracteres sobre esse alfabeto. Chame uma string good se for uma subsequência de mas não uma subsequência de nenhuma de .
Dado , estou procurando encontrar a menor string boa . Existe um algoritmo razoável para isso? Estou interessado em um algoritmo prático, mesmo que seu pior caso de execução não seja grande. No meu domínio, as strings podem ser razoavelmente longas, mas espero que exista uma boa string que seja bastante curta, caso isso ajude.
O caso é tratado pela sub-sequência Mais curta de uma sequência, que não é uma sub-sequência de outra sequência , mas preciso lidar com o caso .
Respostas:
Erros
Em primeiro lugar, nos comentários cometi alguns erros: tanto a reivindicação original que fiz sobre a intercalação como o comentário "corrigindo" (agora excluído) estavam erradas, e separadamente a minha alegação de que tentar todas as intercalações possíveis deve produzir uma solução ideal também estava errado (dou um contra-exemplo simples abaixo). Finalmente, minha sugestão para definir e iterar, ou usar a pesquisa por feixe, também não ajuda: qualquer resposta que possa ser produzida com isso e a aplicação do DP de Aryabhata nunca pode ser melhor do que usar o , pois tudo o que faz é reduzir o tamanho do conjunto de soluções a partir do qual o DP pode escolher. Desculpa! Esperamos que a versão melhorada abaixo não contenha mais problemas ...x+=zj x+
Também notei dois erros no DP de Aryabhata . Felizmente, ambos podem ser facilmente reparados (veja meus comentários nesse post).
Uma solução heurística usando intercalações aleatórias
Se você não precisar absolutamente da subsequência mais curta, poderá usar o fato de que, se uma string for uma subsequência de algum , também será uma subsequência de toda intercalação possível de todas as strings . Por outro lado, se não é uma subsequência de alguma intercalação particular de todas as cadeias , então não é uma subsequência de nenhum indivíduo .s x−i x−i s x−i x−i
Portanto, você pode tentar muitas maneiras diferentes de intercalar aleatoriamente as seqüências em uma única string e, para cada intercalação , procure a subsequência mais curta de que evita ser uma subsequência de usando o bom DP de Aryabhata algoritmo para o caso de duas cordas e escolha o menor que seja o mais curto entre todas as intercalações que você tentou.n x−i yj zj x+ yj zj
Advertência: Não há garantia de otimização, mesmo se tentarmos todas as intercalações
Surpreendentemente (pelo menos para mim), mesmo se você repetir o procedimento acima para todas as intercalações possíveis, não há garantia de encontrar a solução ideal: considere a instância em que , e . Então é uma solução ideal com comprimento 2, mas a solução mais curta encontrada ao tentar todas as intercalações de e é , com comprimento 3.x+=aaa n=2 x−1=x−2=a aa x−1 x−2 aaa
fonte