1. 题目
给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其余单词组合而成。
如有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。
网络
示例: 输入: ["cat","banana","dog","nana","walk","walker","dogwalker"] 输出: "dogwalker" 解释: "dogwalker"可由"dog"和"walker"组成。 提示: 0 <= len(words) <= 100 1 <= len(words[i]) <= 100
来源:力扣(LeetCode)
连接:https://leetcode-cn.com/problems/longest-word-lcci
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。
spa
2. 解题
- 单词可重复使用
- 先按长度降序排列,长度相等,字典序小的在前
- 从前日后找到第一个单词便可
- 将单词拆分红子串,递归判断子串的子串
class Solution { public: string longestWord(vector<string>& words) { if(words.size() < 2) return ""; sort(words.begin(), words.end(),[&](auto a, auto b){ if(a.size() == b.size()) return a < b; return a.size() > b.size(); }); int i, len; string ans, sub; unordered_set<string> set; for(i = 0; i < words.size(); ++i) set.insert(words[i]); for(i = 0; i < words.size()-1; ++i) { for(len = 1; len < words[i].size(); ++len) { sub = words[i].substr(0,len); if(set.count(sub) && ok(words[i].substr(len), set)) return words[i]; } } return ""; } bool ok(string s, unordered_set<string> &set) { if(s=="") return true; bool good = false; for(int len = 1; len <= s.size(); ++len) { string sub = s.substr(0,len); if(set.count(sub) && ok(s.substr(len),set)) { good = true; break; } } return good; } };
48 ms 12.7 MBcode