/// <summary> /// Return existing words changing only one letter /// </summary> /// <param name="sOldString">Initial string</param> /// <returns></returns> private static List<string> GetNewStrings(string sWord, WordDictionary dicc) { List<string> listNewStrings = new List<string>(); if (string.IsNullOrEmpty(sWord)) { sWord = string.Empty; } if (dicc != null) { for (int i = 0; i < sWord.Length; i++) { char letter = sWord.ToLower()[i]; for (char l = 'a'; l <= 'z'; l++) { if (l == sWord[i]) continue; StringBuilder sNewWord = new StringBuilder(sWord); sNewWord[i] = l; if (dicc.Contains(sNewWord.ToString())) { listNewStrings.Add(sNewWord.ToString()); } } } } return listNewStrings; }
/// <summary> /// Get a list of words given a secuence of phone keyboards numbers /// </summary> /// <param name="listNumber"></param> /// <returns></returns> public static List<string> GetWords(List<int> listNumber) { List<string> listWords = new List<string>(); // Validate input if (listNumber == null || listNumber.Count == 0) { throw new ArgumentNullException("listNumber", "List null or empty"); } if (listNumber.Exists (p=> p < 2 || p > 9)) { throw new ArgumentOutOfRangeException("listNumber", "Numbers must be in range 2 - 9"); } // Initialize queue Queue<string> queue = new Queue<string>(); foreach (string s in GetNewStrings(string.Empty, listNumber[0])) { queue.Enqueue(s); } // Generate possible words for (int i=1; i<listNumber.Count; i++) { while (queue.Count > 0 && queue.Peek().Count() <= i) { foreach (string s in GetNewStrings(queue.Dequeue(), listNumber[i])) { queue.Enqueue(s); } } } // Check possible words with a dictionary WordDictionary dicc = new WordDictionary(); while (queue.Count > 0) { string sAux = queue.Dequeue(); if (dicc.Contains(sAux)) { listWords.Add(sAux); } // Add all words generate // listWords.Add(queue.Dequeue()); } return listWords; }