Estou pensando nesse problema há um tempo e só consigo encontrar uma solução recursiva, mas sinto que há uma maneira de programação dinâmica para fazê-lo, mas não consigo descobrir. Esse é um problema famoso que eu não conheço?
P: Dada uma sequência e um padrão, retorne o número de maneiras exclusivas de corresponder as letras do padrão (em ordem) com a sequência.
Esclarecimento: Para encontrar uma correspondência, você pega o primeiro caractere do padrão, encontra o primeiro caractere correspondente na sequência e, em seguida, o segundo caractere do padrão e combina com o primeiro caractere correspondente da sequência APÓS a correspondência anterior personagem.
Exemplo 1 (4 correspondências):
String: DABBCDDE
Padrão: ABD
Maneiras possíveis (caracteres em negrito são onde o padrão é correspondido com a sequência):
- D AB BC D DE
- D A B B C D DE
- D AB BCD D E
- D A B B CD D E
Exemplo 2 (0 correspondências):
String: ABC
Padrão: BCA
(Você combina B, C e, no final da sequência, NÃO pode voltar e combinar com os caracteres anteriores)
Com a abordagem recursiva, eu tenho um método que monitora em qual índice estou na string ( sIndex ), bem como no padrão ( pIndex ). Se a string [sIndex] corresponde ao padrão [pIndex], chamamos o método novamente e aumentamos sIndex e pIndex. Caso contrário, aumente o sIndex e tente novamente para encontrar uma correspondência. O método retorna o número total porque o valor de retorno das chamadas recursivas é adicionado. (Correspondências adicionam 1, nenhuma correspondência adiciona 0)
Casos básicos:
Se pIndex for maior que o comprimento do padrão, retorne 0.
Se sIndex for maior que o comprimento da string, retorne 1 (encontramos uma correspondência!)
Que outras soluções existem?
inserting
bastante enganador. Não é esta a elementos correspondentes em pattern
com elementos string
em ordem em todos os maneira possível?