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

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

  • 相关阅读:
    OpenCV on Mac OSX: A step-by-step guide
    opencv打开摄像头获取视频程序
    使用find_if算法搜寻map的value
    c++如何理解map对象的value_type是pair类型
    关联容器执行器指定排序规则
    仿函数和函数配接器
    C++的异常处理
    back_insert_iterator和insert_iterator
    copy函数与ostream_iterator、reverse_iterator
    const_cast
  • 原文地址:https://www.cnblogs.com/gdouzz/p/8473032.html
Copyright © 2020-2023  润新知