Da der zu durchsuchende String beim Aufruf der Funktion vollständig bekannt ist: Verzichte möglichst auf "teure" Additionen von Strings: Es macht zum Beispiel genau 0 Sinn, wenn du jede auftretende Ziffernfolge aufaddierst, diese abspeicherst, nur um sie später wieder zu verwerfen, wenn du eine längere Folge gefunden hast. - Stringoperationen kosten viel, Integerops wenig.
Merke dir also nur Start und Länge der jeweils "maximalen" Folge und nicht den Zeichensalat.
Beispiel:
A0022DJIOE390220DJIWOEDJ390J3
An Position i=1 liest du A und tust nix.
An i=2 liest du 0. Du merkst dir start=2, dann liest du 0, 2, 2.
Bei i=6 liest du "D"; also keine Ziffer mehr. Du hast die erste Ziffernfolge gefunden: Laenge = i-start = 6-2 = 4. Du merkst dir die momentan längste Folge, indem du maxstart=start=2 und maxlaenge=laenge=4 speicherst.
Es folgen keine Ziffern bis und mit i=10. Du tust nix.
Bei i=11 liest du eine 3. Du merkst dir start=11. Bei i=17 "D" ist die Ziffernfolge zu Ende. Die Laenge = i-start beträgt Laenge=17-11 = 6. Laenge=6 ist grösser als die bisherige maxlaenge=4 => Du merkst dir maxstart=11 maxlaenge=6 usw.
Am Ende weisst du, dass eine längste Folge bei maxstart beginnt und maxlaenge lang ist.
Auf dem zehnjährigen 2,2GHz Prozessor i7-3620QM können so 1000 1Mio Zeichen lange Strings in 4,4 Sekunden durchsucht werden.
Delphi-Quellcode:
function LaengsteZiffernFolgeDerWelt( s : string ) : string;
var
len_s,
maxlaenge, maxstart, laenge, start, i: Integer;
begin
start := 0;
maxlaenge := 0;
maxstart := 0;
i := 1;
len_s := length(s);
while i <= len_s do
begin
if ( s[i] in ['0'..'9'] ) then
begin
if start = 0 then start := i
end
else
begin
if start > 0 then
begin
laenge := i-start;
if laenge > maxlaenge then
begin
maxlaenge := laenge;
maxstart := start;
end;
start := 0;
end;
end;
inc(i);
end;
if start > 0 then // *
begin
laenge := i-start;
if laenge > maxlaenge then
begin
maxlaenge := laenge;
maxstart := start;
end;
end;
if maxlaenge > 0 then Result := Copy( s, maxstart, maxlaenge )
else Result := '';
end;
* Wenn s[length(s)] eine Ziffer ist, dann müssen wir noch prüfen, ob diese letzte Ziffernfolge in s die längste ist. Du könntest auch gleich nach dem "begin" der Funktion an s ein "Nichtzifferzeichen" anhängen. Also s := s+'A'; Dann kannst du auf diesen Check (if start > 0 then begin... end) verzichten. In den allermeisten Fällen wäre das sicher auch ok...