Escreva um programa ou função que, dadas duas seqüências ASCII Ae B, produza sequências A'e B'onde as subseqüências comuns sejam revertidas em seu lugar. O processo para encontrar A'é o seguinte:
A'está inicialmente vazio.- Se o primeiro caractere de
Aestiver emB, encontre o prefixo mais longo doAqual é uma substring deB. Remova esse prefixoAe inclua sua reversão emA'. - Caso contrário, remova esse primeiro caractere
Ae adicione-o aA'. - Repita as etapas 2-3 até
Aficar vazio.
A descoberta B'é feita da mesma forma.
Exemplo
Vamos considerar as strings A = "abc bab"e B = "abdabc". Pois A'é isso que acontece:
A = "abc bab": O primeiro caractere"a"está em B e o prefixo mais longo de A encontrado em B é"abc". Removemos esse prefixo de A e adicionamos sua reversão"cba"a A '.A = " bab": O primeiro caractere" "não está em B, removemos esse caractere de A e o adicionamos a A '.A = "bab": O primeiro caractere"b"está em B e o prefixo mais longo de A encontrado em B é"b". Removemos esse prefixo de A e adicionamos sua reversão (que ainda é"b") a A '.A = "ab": O primeiro caractere"a"está em B e o prefixo mais longo de A encontrado em B é"ab". Removemos esse prefixo de A e adicionamos sua reversão"ba"a A '.A = "": A está vazio, então paramos.
Assim chegamos A' = "cba" + " " + "b" + "ba" = "cba bba". Para B ', o processo é semelhante:
B = "abdabc" -> "a" in A, remove prefix "ab"
B = "dabc" -> "d" not in A, remove "d"
B = "abc" -> "a" in A, remove prefix "abc"
Assim chegamos B' = "ba" + "d" + "cba" = "badcba".
Finalmente, retornamos as duas strings, ou seja,
(A', B') = ("cba bba", "badcba")
Casos de teste
"abc bab", "abdabc" -> "cba bba", "badcba"
"abcde", "abcd bcde" -> "dcbae", "dcba edcb"
"hello test", "test banana" -> "hello tset", "tset banana"
"birds flying high", "whistling high nerds" -> "bisdr flyhgih gni", "wihstlhgih gni nesdr"
O menor código em bytes vence.
"cba bba", "badcba"incluir aspas e vírgula?