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