private static void recursiveWordsFit(List <string> wordsThatFit, bool isFirstCall = false) { foreach (var word in wordsThatFit) { if (isFirstCall) { anagram.Clear(); remainingText = sentence; } anagram.Add(word); string remainingTextBefore = new string(remainingText); bool remainingChar = true; foreach (var c in word) { int indexOfChar = remainingText.IndexOf(c); if (indexOfChar != -1) { remainingText = remainingText.Remove(indexOfChar, 1); } else { remainingChar = false; } } if (!remainingChar) { anagram.RemoveAt(anagram.Count - 1); remainingText = remainingTextBefore; continue; } wordsThatFitRemaining = AnagramSolver.SearchWordsThatFit(remainingText, wordsThatFit); if (wordsThatFitRemaining.Count > 0) { recursiveWordsFit(wordsThatFitRemaining); } else { if (remainingText == string.Empty) { string newAnagram = new string(anagram.OrderBy(f => f).Aggregate((i, j) => i + " " + j)); listAllAnagrams.Add(newAnagram); anagram.Clear(); remainingText = sentence; } else { anagram.RemoveAt(anagram.Count - 1); remainingText = remainingTextBefore; } } } }
static void Main(string[] args) { bool runAgain = true; while (runAgain) { Console.Clear(); header(); Console.WriteLine("Informe a palavra para criação dos anagramas:"); var inputSentence = Console.ReadLine(); inputSentence = inputSentence.ToUpper(); if (!Util.isValid(Util.RemoveSpaceStringReader(inputSentence))) { Console.WriteLine("Error: Caracteres informados inválidos, permitido somente de [A..Z], " + Environment.NewLine + "pressione 'Enter' para voltar."); Console.ReadLine(); continue; } Console.WriteLine("Aguarde! Gerando anagramas..."); var initialTime = DateTime.Now; var listAnagrams = AnagramSolver.GenerateAnagrams(inputSentence); var totalSeconds = (DateTime.Now - initialTime).TotalSeconds; Console.Clear(); Console.WriteLine(string.Format("[{0}] Anagramas encontrados para: {1}", listAnagrams.Count, inputSentence)); Console.WriteLine(); foreach (var item in listAnagrams) { Console.WriteLine(item); } Console.WriteLine(); Console.WriteLine("Total Seconds: " + totalSeconds.ToString("N2")); Console.WriteLine(); Console.WriteLine("pressione 'Enter' para continuar || 'N' para encerrar"); var encerrar = Console.ReadLine(); if (encerrar.ToUpper() == "N") { runAgain = false; } } }
public static List <string> GenerateAnagrams(string inputSentence) { listAllAnagrams.Clear(); sentence = Util.RemoveSpaceStringReader(inputSentence); remainingText = sentence; List <string> listValidWords = ReadFileTXT.ReadValidWordsFile(); List <string> wordsThatFit = AnagramSolver.SearchWordsThatFit(sentence, listValidWords); recursiveWordsFit(wordsThatFit, true); return(listAllAnagrams.OrderBy(f => f).Distinct().ToList()); }