Ihr Algorithmus ist nicht korrekt. Was ist falsch mit Ihrem Algorithmus ist, dass, sobald es ein Zeichen überprüft, es nicht zurück zu diesem Zeichen, um es erneut zu überprüfen, wenn die Teilzeichenfolge einschließlich dieses Zeichen nicht am längsten sein. Die erste s
wird in der Zeichenfolge der Länge 2 überprüft, die as
ist, aber wenn die nächste a
gefunden wird, wird die s
vergessen, obwohl es die nächste Teilzeichenfolge länger machen könnte. Versuchen Sie diesen Code:
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
string s = "aaaaaaaaaaaaasadfrhtytbgrbrsvsrhvsg";
vector<bool> v(256,false);
int longStart = 0;
int longEnd = 0;
int start = 0
for (end = 0; end < s.length(); end++)
{
if (!v[s[end]]) // if character not already in the substring
{
v[s[end]] = true;
if (end - start > longEnd - longStart)
{
longEnd = end;
longStart = start;
}
}
else //the character is already in the substring, so increment the
//start of the substring until that character is no longer in it
{
//get to the conflicting character, but don't get to the new character
while ((s[start] != s[end]) && (start < end))
{
start++;
v[s[start]] = false;
}
//remove the conflicting character
start++;
//don't set v[s[start]] to false because that character is still
//encountered, but as the newly appended character, not the first
}
}
longEnd++; //make longEnd the index after the last character for substring purposes
cout << s.substr(longStart, longEnd - longStart) + " " << (longEnd - longStart) << endl;
}
Im Grunde, was dieser Code tut, ist es eine laufende Teilzeichenfolge hält, und immer dann, wenn es ein Zeichen trifft, die bereits in der Teilkette ist, erhöht er den Start der Teilkette bis zu diesem neuen Charakter ist nicht mehr in der Teilzeichenfolge wird dann normal fortgesetzt. Es prüft auch jedes Mal, wenn das Ende inkrementiert wird, wenn dieser Teilstring länger als der bisher längste ist. Das ist O (n) ich glaube, wie du wolltest.
Verteilen Sie auch Ihren Code. Kurzer Code bedeutet nichts, wenn Sie ihn nicht lesen und leicht debuggen können. Wenn Sie Probleme mit Ihrem Code haben, sollten Sie alles manuell ausführen, um besser zu verstehen, wie alles funktioniert und was passiert.
Hoffe, das hilft!
Sie meinen, Sie können oder können nicht verstehen? – Ediac
Haben Sie eine zeitliche Komplexitätsgrenze? oder Sie wollen nur die Antwort, egal wie lange es dauert, um auszuführen. – Rasool
@Ediac der Algo scheint richtig zu sein. – adrian008