题目

给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。

示例:

输入: [“cat”,“banana”,“dog”,“nana”,“walk”,“walker”,“dogwalker”]
输出: “dogwalker”
解释: "dogwalker"可由"dog"和"walker"组成。

提示:

0 <= len(words) <= 200
1 <= len(words[i]) <= 100

思路

排序, 从长到短, 等长按字典序A < B, 动规d[i] = 1当且仅当前缀串x[0...i - 1]可由words的集合set中的单词构成.
关键函数是动规部分, 分两种情况讨论(注意是完备的划分),

  1. x[0...i - 1]直接能成字符串则d[i]赋值为1,
  2. 不能直接找到匹配的字符串, 则取前缀串的两段划分, x[0...j]是一个字符串, x[j + 1...i - 1]是一种字符串时, d[i] = 1.

代码

class Solution {public:int d[200 + 5];struct cmp{bool operator()(const string& A, const string& B){return A.size() > B.size() || (A.size() == B.size() && A < B); // longer is higher priority and smaller dictionary order is higher priority when two strings have same length}};string longestWord(vector<string>& words) {unordered_set<string> S(words.begin(), words.end());sort(words.begin(), words.end(), cmp());for(auto x: words){if(x.empty()) continue;memset(d, 0, sizeof(d));if(dyn(x, S)) return x;}return ""; // no answer}bool dyn(const string& x, const unordered_set<string>& S){for(int i = 0; i < x.size(); i++){if(i < x.size() - 1){string suba = x.substr(0, i + 1);if(S.count(suba)) d[i] = 1;}for(int j = 0; j < i; j++){if(!d[j]) continue;string subb = x.substr(j + 1, i - j);if(S.count(subb)){d[i] = 1;break;}}}return d[x.size() - 1];}
};

总结

(1) string.substr(start, length)
(2) for(auto x: nums)类似python中的for i in range(n)的用法
(3) set.count(string)在set中查找string

leetcode - 最长单词相关推荐

  1. leetcode 最长单词

    题目链接 思路一:字典树+回溯 首先将数组进行排序,按照长度降序,一样的长度,再按照字典序升序. 再将所有的单词建立成一颗字典树,这是为了后面的查找效率. 再从前往后遍历查找每个单词,是否由其他单词拼 ...

  2. ​LeetCode刷题实战524:通过删除字母匹配到字典里最长单词

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  3. leetcode面试题 17.15. 最长单词

    给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成.若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串. 示例: 输入: ...

  4. Leetcode刷题100天—524. 通过删除字母匹配到字典里最长单词(双指针)—day38

    前言: 作者:神的孩子在歌唱 大家好,我叫运智 524. 通过删除字母匹配到字典里最长单词 难度中等192收藏分享切换为英文接收动态反馈 给你一个字符串 s 和一个字符串数组 dictionary 作 ...

  5. leetcode记录-524-通过删除字母匹配到字典里最长单词-双指针

    524.通过删除字母匹配到字典里最长单词 思路 理解题意是一大难点...对于list中的字符串,如果可以由s删除一些字符得到,那么这个字符串初步符合标准,把他和str(初始为空)的比较,如果其长度更长 ...

  6. LeetCode 244. 最短单词距离 II(哈希map+set二分查找)

    文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 哈希表+set二分查找 1. 题目 请设计一个类,使该类的构造函数能够接收一个单词列表. 然后再实现一个方法,该方法能够分别接收两个单词 w ...

  7. LeetCode 245. 最短单词距离 III

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离. word1 和 word2 是有可能相同的,并且它们将分别表 ...

  8. LeetCode 243. 最短单词距离

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离. 示例: 假设 words = ["practice ...

  9. 程序员面试金典 - 面试题 17.15. 最长单词(排序+递归)

    1. 题目 给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成. 若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串. ...

最新文章

  1. 程序员整理的各种不错的工具
  2. R语言应用实战-聚类分析以及k-means的优缺点
  3. 【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
  4. 用MATLAB编程正弦稳态相量图,matlab课程设计--利用MATLAB对线性电路正弦稳态特性分析...
  5. U盘数据泄露,用不到30行的Python代码就能盗走
  6. leetcode hot 3-4
  7. json解析库go-simplejson使用
  8. 微信小程序制作家庭记账本之一
  9. 【计算机组成原理】计算机系统概述 —— 计算机硬件组成与性能指标
  10. 测试基本理论-看这篇就够了
  11. 配置网络地址转换NAT技术实验
  12. pop3协议解析及代码实现
  13. Autumn Web Handler
  14. SQL Server 、SQLiteSpy、Access对应数据库后缀名分别是什么?
  15. 微擎系统换服务器,微擎服务器迁移
  16. RequireJS介绍与应用
  17. angular使用service应用分层
  18. 【C语言刷LeetCode】717. 1 比特与 2 比特字符(E)
  19. 《目标检测蓝皮书》第3篇 卷积神经网络
  20. unity 里让一个物体围绕x,y,z轴旋转起来。

热门文章

  1. webmagic mysql_WebMagic Pipeline - MySQL
  2. 如何使用jQuery获取元素的ID?
  3. Rockchip rk3588 U-Boot详解 (一)
  4. OwnCloud网盘的搭建(2021年最新版)
  5. Federation 简介
  6. Unity接入Naudio实现多音频播放和多声道融合
  7. byte[]数组相等比较
  8. 阿里技术面全A,终面却被产品经理拉下马。。
  9. BEA系统(中国)有限公司--成都分公司诚聘实习生一名,地点:成都
  10. Wordpress漏洞利用WPscan使用