Gibt es einen dynamischen Programmieralgorithmus, um die längste Teilsequenz in einer Zeichenfolge X zu finden, die Y nicht als Teilzeichenfolge enthält? Nur dass dieses Problem anderen DP-String-Algorithmen wie der längsten gemeinsamen Teilsequenz und dem längsten String so ähnlich zu sein scheint. Es muss in der Lage sein, Vorkommen von Y zu verarbeiten, die sich überlappen.
Es scheint, dass dies ein DP-Problem mit zwei Zuständen sein könnte, wobei der Zustand [s_pos, t_pos] die längste Teilsequenz des Strings S ist, der bei s_pos beginnt und keinen Stich T [t_pos..M] als Teilzeichenfolge hat. N ist die Länge der Zeichenkette S und M ist die Länge der Zeichenkette T. Meine Übergänge sind jedoch nicht korrekt: Es wird nicht der Fall erhalten, in dem S = aaabc
und T = aabc
. Das Problem liegt in der else- Anweisung - ich weiß nicht, wie ich übergehen soll, wenn die Zeichen gleich sind. Eigentlich habe ich das Gefühl, dass der if-Zweig falsch ist ... weiß jemand, was falsch sein könnte?
Es scheitert sogar der Fall S = aaab
und T = aab
. Ich kann erklären, warum es fehlschlägt: Angenommen, ich rufe lösen (0, 0). lösen (0, 0) ruft lösen (1, 1) auf. lösen (1, 1) ruft lösen (2, 2) auf. Da s [2]! = T [2] ist, wird die Suche von lösen (3, 0) neu gestartet. Aab ist jedoch ein Teilstring und überprüft dies niemals oder berücksichtigt diesen Fall ...
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;
}