2016-06-17 9 views
-1

Frage: Ich habe eine lange Zeichenfolge, und ich muss die Anzahl der Vorkommen aller unter dieser Zeichenfolge vorhandenen Unterzeichenfolgen finden und eine Liste aller Unterzeichenfolgen und ihre Anzahl drucken (if count ist> 1) in absteigender Reihenfolge.Um Vorkommen aller Unterzeichenfolgen in Zeichenfolge C zu zählen #

Beispiel:

String = "abcdabcd" 

Ergebnis:

Substrings  Count 
abcd   2 
abc    2 
bcd    2 
ab    2 
bc    2 
cd    2 
a    2 
b    2 
c    2 
d    2 

Problem: Mein String kann 5000 Zeichen lang sein, und ich bin nicht in der Lage eine effiziente Art und Weise zu finden, dies zu erreichen (Effizienz ist sehr wichtig. zur Anwendung)

Ist ein Algorithmus vorhanden oder ist Multi-Threading möglich? bitte hilfe.

+1

bitte einen Blick auf * Suffixbaum haben * oder/und * Suffixarray * https://en.wikipedia.org/ wiki/Suffix_array –

+0

@DmitryBychenko: Ich habe mit Suffix-Struktur und Suffix-Array versucht, aber es gibt keine schnelle Möglichkeit aus Suffix-Baum, um alle Unterzeichenfolgen zu finden. Wenn jedoch Sub-String als Eingabe angegeben ist, können Sie die Anzahl seiner Vorkommen sehr effizient durch Suffix-Baum finden. –

+0

Mögliches Duplikat von [Eine gemeinsame Zeichenfolge in einer Liste von Zeichenfolgen finden] (http://stackoverflow.com/questions/13509277/find-a-common-string-within-a-list-of-strings) – Clint

Antwort

0

Beispiel für die Verwendung: Find a common string within a list of strings

void Main() 
{ 
    "abcdabcd".getAllSubstrings() 
     .AsParallel() 
     .GroupBy(x => x) 
     .Select(g => new {g.Key, count=g.Count()}) 
     .Dump(); 
} 

// Define other methods and classes here 

public static class Ext 
{ 
    public static IEnumerable<string> getAllSubstrings(this string word) 
    { 
     return from charIndex1 in Enumerable.Range(0, word.Length) 
      from charIndex2 in Enumerable.Range(0, word.Length - charIndex1 + 1) 
      where charIndex2 > 0 
      select word.Substring(charIndex1, charIndex2); 
    } 
} 

Produziert:

a 2 
dabc 1 
abcdabc 1 
b 2 
abc 2 
dabcd 1 
bc 2 
bcda 1 
abcd 2 
ab 2 
bcdab 1 
cdabc 1 
abcda 1 
d 2 
bcdabc 1 
dab 1 
bcd 2 
abcdab 1 
c 2 
bcdabcd 1 
abcdabcd 1 
cd 2 
da 1 
cdab 1 
cda 1 
cdabcd 1 
+0

Es funktioniert gut für 1000 Zeichen lange Zeichenfolge, aber geben Out-of-Memory-Ausnahme für String-Länge mehr als 2000. Fehler in Zeile "word.Substring (charIndex1, charIndex2);" Irgendwelche Vorschläge? –

+0

@NancyGarg Strings, die groß sind, werden unvermeidlich OOM-Fehler verursachen, so dass viele String-Ops so schnell viele Arrays erzeugen; mein Vorschlag wäre, das allgemeine Prinzip zu verwenden, aber eine andere Struktur für die Arbeit mit der Zeichenfolge zu verwenden - ein String Builder/Roll etwas anderes. – Clint

+1

Ich habe 32-Bit-Compiler zu 64 Bit geändert und es hat funktioniert. Es ist auch sehr effizient im Vergleich zu meinem früheren Ansatz. Danke eine Tonne .. :) –