2016-09-11 2 views
3

Ich arbeite an einem Programm entschlüsseln Typ, wo ein Benutzer in der Lage ist, zufällige Buchstaben eingeben und das Programm durchläuft die Buchstaben und eine Wortliste zu versuchen, Wörter zu finden, die diese einige oder alle enthalten zufällige Buchstaben in der Wortliste.Suche Wörter in Wortliste aus zufälligen Zeichenfolge

Zum Beispiel:

if Input = "sasdfle" 
words found in wordlist = "sad", "fleas", "flea", etc... 

Worte können nur Buchstaben enthält, die Eingaben vom Benutzer sind und jeder Buchstabe wiederholt werden kann nicht. Ich habe hier mehrere Fragen gefunden, die Anagramme finden, aber ich kann keinen Algorithmus finden, der das tut, was ich oben gesagt habe.

Ich will hier nicht den gesamten Code schreiben, aber hier ist der wichtigste Teil, die Ich habe Probleme mit:

+1

können Sie zeigen uns, was Sie auf Ihrem eigenen versucht haben, ..? Es gibt einige Beispiele da draußen, aber ich bin mir sicher, dass andere gerne sehen würden, was du gerade machst, nur um dir eine schnelle Antwort zu geben. Was hast du probiert? – MethodMan

+0

Erwäge, deinen Code über das, was du bisher versucht hast, zu posten – Rahul

+0

Ich habe den Beitrag aktualisiert. Ich hoffe es ist klar. –

Antwort

3

Vorausgesetzt, dass Sie eine entsprechenden englischen Worten Sammlung, zum Beispiel in ihm sortiert ("flea" =>"aefl", "sad" =>"ads" usw.)

private static HashSet<String> s_Words = new HashSet<String>() { 
    "abacus", 
    //... 
    "flea", 
    "fleas", 
    //... 
    "sad", 
    "sea", 
    // ... 
    "zoom", 
}; 

Sie es in bequemer aggregierte Wörterbuch mit Schlüssel ist eine erste Zeichenfolge mit allen Buchstaben umwandeln kann. Wenn zwei oder mehr Wörter, die gleichen Schlüssel haben, sollten sie sein in einer Sammlung zusammengefasst, sagen wir, ein Array:

"ale", "lea" => "ael" : ["ale", "lea"] 

können Sie implementieren ein solches Wörterbuch über Linq:

private static Dictionary<String, String[]> s_Dict = s_Words 
    .Select(word => new { 
    Key = String.Concat(word.OrderBy(c => c)), 
    Value = word}) 
    .GroupBy(item => item.Key, item => item.Value) 
    .ToDictionary(chunk => chunk.Key, chunk => chunk.ToArray()); 

dann wird eine Zeichenfolge

gegeben
String Input = "sasdfle" 

alles, was Sie tun müssen, ist zu Art es und lassen nur 256 (2 ** (length + 1) == 256) Kombinationen einschließlich und excuding jeden Buchstaben:

string source = String.Concat(Input.OrderBy(c => c)); 

// all combinations of the set with empty one excluded, see 
// http://stackoverflow.com/questions/30081908/c-sharp-linq-combinatorics-all-combinations-of-a-set-without-the-empty-set/30082360#30082360 
var result = Enumerable 
    .Range(1, (1 << source.Length) - 1) 
    .Select(index => string.Concat(source.Where((item, idx) => ((1 << idx) & index) != 0))) 
    .SelectMany(key => { 
    String[] words; 

    if (s_Dict.TryGetValue(key, out words)) 
     return words; 
    else 
     return new String[0]; }) 
    .Distinct() // some words can be built in many ways 
    .OrderBy(word => word); 
//.ToArray(); // if you want to represent words as array 

-Test

Console.Write(String.Join(Environment.NewLine, result)); 

zurück

flea 
fleas 
sad 
sea 
+0

Ich habe nicht vorher in LINQ geschrieben, so dass es kompliziert macht, den Code zu lesen. Kannst du vielleicht etwas Code hinzufügen, damit ich es verstehen kann? Oder schau dir meinen Code an und schau, was ich falsch machen könnte. –

+0

@ re.m7: * Linq * ist nur ein bequemer Weg, um das Problem zu lösen, können Sie ein aggregiertes Wörterbuch sowie Teilmengen mit Schleifen gut erstellen. Der einzige komplexe Teil des Codes ist in der letzten Abfrage 'var result = Enumerable.Range (...). Wählen Sie (...).', , die alle Teilmengen aus der gegebenen Menge erzeugt, wobei leer ausgeschlossen ist. Siehe meine Antwort http://stackoverflow.com/questions/30081908/c-sharp-linq-combinators-all-combinations-of-a-set-without-the-empty-set/30082360#30082360 für Details –

Verwandte Themen