zoukankan      html  css  js  c++  java
  • [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 题目汇总

  • 相关阅读:
    客商支付明细SQL_billdate
    两张表判断赋值,都是NULL惹的祸…
    DataGridView使用初步
    在SQL Server 2005中启用“SQL Server”身份验证
    .Net学习笔记——细节问题
    C#调用带返回值的存储过程
    利用ASP.NET一般处理程序动态生成Web图像
    Windows Forms数据绑定技术
    C#中产生SQL语句的几种方式
    风讯dotNETCMS源码分析—数据存取篇
  • 原文地址:https://www.cnblogs.com/grandyang/p/5469649.html
Copyright © 2011-2022 走看看