Fa esiste un algoritmo di programmazione dinamica per trovare la sottosequenza più lunga in una stringa X che non contiene Y come stringa? Solo che questo problema sembra così simile ad altri algoritmi di stringa DP come la sottosequenza e le stringhe più lunghe comuni. Deve essere in grado di gestire le occorrenze di Y che si sovrappongono.
Sembra che questo potrebbe essere un problema 2-stato DP, con lo Stato [s_pos, t_pos] essendo la sottosequenza più lunga della stringa S a partire da s_pos che non hanno punge T [t_pos..M] come una stringa. N è la lunghezza della stringa S e M è la lunghezza della stringa T. Tuttavia, le transizioni non sono corretti: non ottiene il caso in cui S = aaabc
e T = aabc
. Il problema è nell'istruzione else - Non so come eseguire la transizione se i caratteri sono uguali. In realtà sento che il ramo if è sbagliato ... qualcuno sa cosa potrebbe essere sbagliato?
Fallisce persino il caso S = aaab
e T = aab
. Posso spiegare perché fallisce: supponendo chiamo risolva (0, 0). risolvere (0, 0) chiamate risolve (1, 1). risolve (1, 1) chiama risolva (2, 2). Poiché s [2]! = T [2], riavvia la ricerca da solve (3, 0). Tuttavia, aab è una sottostringa e non verifica mai questo o considera questo 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;
}