¿Existe un algoritmo de programación dinámica para encontrar la subsecuencia más larga en una cadena X que no contiene Y como subcadena? Solo que este problema parece tan similar a otros algoritmos de cadena DP como la subsecuencia común más larga y la cadena. Debe ser capaz de manejar las ocurrencias de Y que se superponen.
Parece que esto podría ser un problema DP de 2 estados, con el estado [s_pos, t_pos] siendo la subsecuencia más larga de la cadena S que comienza en s_pos que no tiene la picadura T [t_pos..M] como una subcadena. N es la longitud de la cadena S y M es la longitud de la cadena T. Sin embargo, mis transiciones no son correctas: no aparece el caso donde S = aaabc
y T = aabc
. El problema está en la declaración else : no sé cómo hacer la transición si los caracteres son iguales. En realidad siento que si la rama está mal ... ¿Alguien sabe qué podría estar mal?
Incluso falla el caso S = aaab
y T = aab
. Puedo explicar por qué falla: suponiendo que llamo a resolver (0, 0). resolver (0, 0) llama a resolver (1, 1). resolver (1, 1) llama a resolver (2, 2). Como s [2]! = T [2], reinicia la búsqueda desde resolver (3, 0). Sin embargo, aab es una subcadena y nunca verifica esto o considera este caso ...
int solve(int s_pos, int t_pos)
{
if (s_pos >= N || t_pos >= M) return 0;
if (t_pos == M - 1 && s[s_pos] == t[t_pos]) return 0;
int ret = 0;
if (s[s_pos] != t[t_pos])
{
int tmp = solve(s_pos + 1, 0);
ret = max(ret, tmp + 1);
}
else
{
for (int i = s_pos + 1; i < N; i++)
{
int tmp = solve(i, t_pos + 1);
if (tmp != 0)
{
ret = max(ret, 1 + tmp);
}
}
}
return ret;
}