每日一算之变位词(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);
        }

上面就是变位词算法,请大家指教。如果有不明白的地方,欢迎评论,交流。

原文地址:https://www.cnblogs.com/gdouzz/p/8473032.html