Gibt es einen schnellen Algorithmus, um wiederholte Teilstrings in einer Zeichenkette zu entfernen?

8

Es gibt eine ähnliche Zeichenfolge

%Vor%

und ich möchte es in

zusammenführen %Vor%

Weitere Beispiele:   ddxddx - & gt; dxdx, abbab - & gt; abab.

Die Regel lautet:

%Vor%

Ich habe es in meinem Code in Python gemacht, aber es ist langsam, wenn in einer langen Zeichenfolge.

%Vor%

Gibt es einen schnelleren Weg, es zu lösen?

  

Update 29. April 2017

Tut mir leid, es scheint ein XY-Problem zu mögen. Auf der anderen Seite vielleicht nicht. Da ist der Inhalt

Ich habe für eine Webspinne programmiert und viele 'Tag-Pfade' wie diese bekommen

%Vor%

Wie Sie sehen, gibt es einige 'Tag-Pfade', die auf die gleiche Art und Weise erstellt wurden. Daher wollte ich sie ausblenden, um herauszufinden, ob dort irgendwelche anderen 'Tag-Pfade' die gleiche Struktur haben. Nach dem Kollaps bekomme ich den 'Tag-Pfad' so.

%Vor%

Das ist nur meine Idee und ich wusste nicht, ob es so ist. (Nachdem ich es versucht habe, habe ich einen anderen Weg gewählt.

Allerdings gibt es eine interessante Frage wie eine ACM-Frage.

Also vereinfache ich einen "Tag-Pfad" zu einem Charakter und bitte um Hilfe. Denn ich habe keinen schnellen Weg alleine gemacht. Tatsächlich hat die Frage viele Eckfälle, denen ich nichts ausmache und danke allen, dass sie mir geholfen haben, es zu vervollständigen.

Danke allen.

    
haomao 28.04.2017, 09:19
quelle

6 Antworten

13

Siehe die Macht der Regex:

%Vor%

Sucht nach einer Folge von 1 oder mehr beliebigen Zeichen (.+?) (als nicht gierige Übereinstimmung, so dass es zuerst kürzere Sequenzen versucht), gefolgt von 1 oder mehr Wiederholungen der übereinstimmenden Sequenz + , und ersetzt sie Alles mit nur der übereinstimmenden Sequenz .

    
jasonharper 28.04.2017 13:20
quelle
0

Dies kann ein Anfang sein:

%Vor%

Das Ergebnis in den Beispielen:

%Vor%     
silel 28.04.2017 10:52
quelle
0

Das ist eine großartige Frage / Reihe von Antworten!

Hier ist eine Implementierung mit einem Generator und String-Slicing:

%Vor%

Bearbeiten: Die Schrittsuche wurde geändert, um die Quadratwurzel der Länge zu verwenden, um die Suchzeiten zu verbessern:

  • %Code% 10000 Schleifen, best of 3: 24,7 μs pro Schleife
  • %Code% 1000 Loops, Bestes von 3: 384 μs pro Schleife
  • %Code% 10000 Schleifen, best of 3: 27,1 μs pro Schleife
  • %Code% 1000 Loops, Bestes von 3: 382 μs pro Schleife
Thomas M 28.04.2017 14:58
quelle
0
___ answer43678460 ___

Dies kann ein Anfang sein:

%Vor%

Das Ergebnis in den Beispielen:

%Vor%     
___ answer43681243 ___

Siehe die Macht der Regex:

%Vor%

Sucht nach einer Folge von 1 oder mehr beliebigen Zeichen %code% (als nicht gierige Übereinstimmung, so dass es zuerst kürzere Sequenzen versucht), gefolgt von 1 oder mehr Wiederholungen der übereinstimmenden Sequenz %code% , und ersetzt sie Alles mit nur der übereinstimmenden Sequenz %code% .

    
___ qstnhdr ___ Gibt es einen schnellen Algorithmus, um wiederholte Teilstrings in einer Zeichenkette zu entfernen? ___ answer43683232 ___

Das ist eine großartige Frage / Reihe von Antworten!

Hier ist eine Implementierung mit einem Generator und String-Slicing:

%Vor%

Bearbeiten: Die Schrittsuche wurde geändert, um die Quadratwurzel der Länge zu verwenden, um die Suchzeiten zu verbessern:

  • %Code% 10000 Schleifen, best of 3: 24,7 μs pro Schleife
  • %Code% 1000 Loops, Bestes von 3: 384 μs pro Schleife
  • %Code% 10000 Schleifen, best of 3: 27,1 μs pro Schleife
  • %Code% 1000 Loops, Bestes von 3: 382 μs pro Schleife
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123string ___ Eine Zeichenfolge ist eine endliche Abfolge von Symbolen, die üblicherweise für Text verwendet wird, manchmal jedoch auch für beliebige Daten. ___ antwort43703379 ___

Eine Zeile:

%Vor%

Es funktioniert mit allen iterierbaren Daten, Return-Liste.

%Vor%

Treten Sie bei, wenn Sie eine Zeichenfolge benötigen:

%Vor%     
___ antwort43730413 ___
%Vor%     
___ tag123algorithm ___ Ein Algorithmus ist eine Folge wohldefinierter Schritte, die eine abstrakte Lösung für ein Problem definieren. Verwenden Sie dieses Tag, wenn sich Ihr Problem auf den Algorithmusentwurf bezieht. ___ answer43829035 ___

Ein linearer Ansatz

%Vor%

Ergebnis:

dxabcabcyyyydxycxcxz - & gt; dxabcabcydxycxcxz

    
___ qstntxt ___

Es gibt eine ähnliche Zeichenfolge

%Vor%

und ich möchte es in

zusammenführen %Vor%

Weitere Beispiele:   ddxddx - & gt; dxdx, abbab - & gt; abab.

Die Regel lautet:

%Vor%

Ich habe es in meinem Code in Python gemacht, aber es ist langsam, wenn in einer langen Zeichenfolge.

%Vor%

Gibt es einen schnelleren Weg, es zu lösen?

  

Update 29. April 2017

Tut mir leid, es scheint ein XY-Problem zu mögen. Auf der anderen Seite vielleicht nicht. Da ist der Inhalt

Ich habe für eine Webspinne programmiert und viele 'Tag-Pfade' wie diese bekommen

%Vor%

Wie Sie sehen, gibt es einige 'Tag-Pfade', die auf die gleiche Art und Weise erstellt wurden. Daher wollte ich sie ausblenden, um herauszufinden, ob dort irgendwelche anderen 'Tag-Pfade' die gleiche Struktur haben. Nach dem Kollaps bekomme ich den 'Tag-Pfad' so.

%Vor%

Das ist nur meine Idee und ich wusste nicht, ob es so ist. (Nachdem ich es versucht habe, habe ich einen anderen Weg gewählt.

Allerdings gibt es eine interessante Frage wie eine ACM-Frage.

Also vereinfache ich einen "Tag-Pfad" zu einem Charakter und bitte um Hilfe. Denn ich habe keinen schnellen Weg alleine gemacht. Tatsächlich hat die Frage viele Eckfälle, denen ich nichts ausmache und danke allen, dass sie mir geholfen haben, es zu vervollständigen.

Danke allen.

    
___
HellsYeah 30.04.2017 05:53
quelle
0
___ answer43678460 ___

Dies kann ein Anfang sein:

%Vor%

Das Ergebnis in den Beispielen:

%Vor%     
___ answer43681243 ___

Siehe die Macht der Regex:

%Vor%

Sucht nach einer Folge von 1 oder mehr beliebigen Zeichen %code% (als nicht gierige Übereinstimmung, so dass es zuerst kürzere Sequenzen versucht), gefolgt von 1 oder mehr Wiederholungen der übereinstimmenden Sequenz %code% , und ersetzt sie Alles mit nur der übereinstimmenden Sequenz %code% .

    
___ qstnhdr ___ Gibt es einen schnellen Algorithmus, um wiederholte Teilstrings in einer Zeichenkette zu entfernen? ___ answer43683232 ___

Das ist eine großartige Frage / Reihe von Antworten!

Hier ist eine Implementierung mit einem Generator und String-Slicing:

%Vor%

Bearbeiten: Die Schrittsuche wurde geändert, um die Quadratwurzel der Länge zu verwenden, um die Suchzeiten zu verbessern:

  • %Code% 10000 Schleifen, best of 3: 24,7 μs pro Schleife
  • %Code% 1000 Loops, Bestes von 3: 384 μs pro Schleife
  • %Code% 10000 Schleifen, best of 3: 27,1 μs pro Schleife
  • %Code% 1000 Loops, Bestes von 3: 382 μs pro Schleife
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123string ___ Eine Zeichenfolge ist eine endliche Abfolge von Symbolen, die üblicherweise für Text verwendet wird, manchmal jedoch auch für beliebige Daten. ___ antwort43703379 ___

Eine Zeile:

%Vor%

Es funktioniert mit allen iterierbaren Daten, Return-Liste.

%Vor%

Treten Sie bei, wenn Sie eine Zeichenfolge benötigen:

%Vor%     
___ antwort43730413 ___
%Vor%     
___ tag123algorithm ___ Ein Algorithmus ist eine Folge wohldefinierter Schritte, die eine abstrakte Lösung für ein Problem definieren. Verwenden Sie dieses Tag, wenn sich Ihr Problem auf den Algorithmusentwurf bezieht. ___ answer43829035 ___

Ein linearer Ansatz

%Vor%

Ergebnis:

dxabcabcyyyydxycxcxz - & gt; dxabcabcydxycxcxz

    
___ qstntxt ___

Es gibt eine ähnliche Zeichenfolge

%Vor%

und ich möchte es in

zusammenführen %Vor%

Weitere Beispiele:   ddxddx - & gt; dxdx, abbab - & gt; abab.

Die Regel lautet:

%Vor%

Ich habe es in meinem Code in Python gemacht, aber es ist langsam, wenn in einer langen Zeichenfolge.

%Vor%

Gibt es einen schnelleren Weg, es zu lösen?

  

Update 29. April 2017

Tut mir leid, es scheint ein XY-Problem zu mögen. Auf der anderen Seite vielleicht nicht. Da ist der Inhalt

Ich habe für eine Webspinne programmiert und viele 'Tag-Pfade' wie diese bekommen

%Vor%

Wie Sie sehen, gibt es einige 'Tag-Pfade', die auf die gleiche Art und Weise erstellt wurden. Daher wollte ich sie ausblenden, um herauszufinden, ob dort irgendwelche anderen 'Tag-Pfade' die gleiche Struktur haben. Nach dem Kollaps bekomme ich den 'Tag-Pfad' so.

%Vor%

Das ist nur meine Idee und ich wusste nicht, ob es so ist. (Nachdem ich es versucht habe, habe ich einen anderen Weg gewählt.

Allerdings gibt es eine interessante Frage wie eine ACM-Frage.

Also vereinfache ich einen "Tag-Pfad" zu einem Charakter und bitte um Hilfe. Denn ich habe keinen schnellen Weg alleine gemacht. Tatsächlich hat die Frage viele Eckfälle, denen ich nichts ausmache und danke allen, dass sie mir geholfen haben, es zu vervollständigen.

Danke allen.

    
___
Suraj Dubal 02.05.2017 05:03
quelle
0

Ein linearer Ansatz

%Vor%

Ergebnis:

dxabcabcyyyydxycxcxz - & gt; dxabcabcydxycxcxz

    
brc 07.05.2017 07:43
quelle

Tags und Links