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;
                    }
                }
            }
        }
Exemple #2
0
        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());
        }