每日一算之变位词(C#)
今天看编程珠玑里面,看到一个关于查找变位词的题目,大概意思如下:post,stop,tops这几个是变位词,找出类似的这些词语来。
解题思路一:既然是变位词,1、他们的长度一定是一致的;2、还有就是他们的asii码(经过排序之后,顺序应该是相同的)
//是否为变位词 static bool IsAnagrams(string input, string word){ if (input.Length != word.Length){ return false; } var inputAsiis = GetAsiiOrders(input); var wordAsiis = GetAsiiOrders(word); return !inputAsiis.Except(wordAsiis).Any(); } //获取asii码数组(排序后) static List<int> GetAsiiOrders(string str){ List<int> asiiList = new List<int>(); foreach (var c in str.ToCharArray()) { asiiList.Add(c); } return asiiList.OrderBy(d => d).ToList(); }
上面这种做法了,不是最优解,因为要每一个,一个的进行比较。
解决方法二:一个个比较,比较完了之后移除,最后检查长度是否为零。
static bool CheckAnagrams(string input, string word) { foreach (var letter in input) { var index = word.IndexOf(letter); if (index >= 0) { word = word.Remove(index, 1); } else { return false; } if (word.Length == 0) { return true; } } if (word.Length == 0) { return true; } return false; }
解决思路三:(书中所说的)
//dictionary里面存了所有的英文字典是一个List<string>。 //然后根据单词内部字母进行排序(分组) var anagrams = dictionnary.ToLookup(SortLetter).Where(d => d.Count() > 1); string inputWord = "post"; //类似于输入 string key = SortLetter(inputWord); //调整post顺序,为opst; //key相等的第一项内容就是,所有对应的变位词。 var results = anagrams.FirstOrDefault(d => d.Key == key);
static string SortLetter(string word){ char[] arr = word.ToCharArray(); Array.Sort(arr); return new string(arr); }
上面就是变位词算法,请大家指教。如果有不明白的地方,欢迎评论,交流。
终极目标:世界大同