• [CareerCup] 18.7 Longest Word 最长的单词


    5.7 Given a list of words, write a program to find the longest word made of other words in the list. 

    这道题给了我们一个字符串数组,让我们找到最长的那个单词是由字符串数组中的其他单词组成的,LeetCode上跟类似的题目有Word BreakWord Break II。那么我们首先来想如果是拆分两个单词怎么做,那我们要首先把所有的单词存到哈希表里,然后遍历每个单词,每个位置上都拆分成左右两个字符串,然后看它们是否都在哈希表中存在,都存在的话就表示该单词符合要求。那么对于拆分成多个单词,我可以使用递归来做,我们首先给单词组进行排序,长度长的在前面,我们需要用哈希表建立单词和其是否能拆分的布尔值之间的映射,还有用一个变量is_original_word表示该单词是单词组的单词还是在递归过程中拆分出来的单词,然后从头开始遍历单词,对于每个单词,我们还是从每个位置拆分成左右两边,如果左边的单词在哈希表中存在且其是可以拆分的,那么我们再递归调用右边的单词,如果所有的拆分方法都完成了,该单词还是不能拆成已有的单词,那么将其哈希表中的值赋为false。

    bool can_build_word(string word, bool is_original_word, unordered_map<string, bool> &m) {
        if (m.count(word) && !is_original_word) return m[word];
        for (int i = 1; i < word.size(); ++i) {
            string left = word.substr(0, i);
            string right = word.substr(i);
            if (m.count(left) && m[left] && can_build_word(right, false, m)) {
                return true;
            }
        }
        m[word] = false;
        return false;
    }
    
    string print_longest_word(vector<string> &words) {
        unordered_map<string, bool> m;
        for (auto a : words) m[a] = true;
        sort(words.begin(), words.end(), [](const string &a, const string b){return a.size() > b.size();});
        for (auto a : words) {
            if (can_build_word(a, true, m)) {
                return a;
            }
        }
        return "";
    }

    CareerCup All in One 题目汇总

  • 相关阅读:
    Java IO总结
    Tomcat处理一个HTTP请求的过程
    Tomcat的web项目部署方式
    Tomcat性能调优
    jquery基础知识汇总
    Javascript中的正则表达式
    HTTP首部
    HTTPS
    Javascript中关于cookie的那些事儿
    HTTP请求方法详解
  • 原文地址:https://www.cnblogs.com/grandyang/p/5469649.html
Copyright © 2020-2023  润新知