Leetcode 720. 词典中最长的单词(为啥感觉这道题很难?)
给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。
若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。
示例 1:
输入:words = ["w","wo","wor","worl", "world"] 输出:"world" 解释: 单词"world"可由"w", "wo", "wor", 和 "worl"逐步添加一个字母组成。
示例 2:
输入:words = ["a", "banana", "app", "appl", "ap", "apply", "apple"] 输出:"apple" 解释:"apply" 和 "apple" 都能由词典中的单词组成。但是 "apple" 的字典序小于 "apply"
提示:
- 1 <= words.length <= 1000
- 1 <= words[i].length <= 30
- 所有输入的字符串 words[i] 都只包含小写字母。
主要思路:先自定义排序,然后定义个二维数组用来存储长度一致的单词
之后判断长度是否连续,内容是否递增即可
Code:
class Solution { public: static bool cmp(const string &s1,const string &s2) { if(s1.length()==s2.length()) return s1<s2; return s1.length()<s2.length(); } string longestWord(vector<string>& words) { sort(words.begin(),words.end(),cmp); int len=1; int maxlen=words[words.size()-1].length(); vector<vector<string>>vec; int start_index=0; for(int i=1;i<=maxlen;i++) { bool flag=false;//用来判断长度是否是连续 bool flag2=false;//用来判断内容是否递增 vector<string>temp; for(int j=start_index;j<words.size();j++) { if(words[j].length()==i) { flag=true; //cout<<words[j]<<endl; if(i!=1) { vector<string>sub=vec[i-2]; string t=words[j].substr(0,i-1); if(find(sub.begin(),sub.end(),t)!=sub.end()) { // cout<<words[j]<<endl; temp.push_back(words[j]); flag2=true; } } if(i==1) { flag2=true; temp.push_back(words[j]); } } else { start_index=j; break; } } if(flag&&flag2) { if(i==maxlen) return temp[0]; } if(!flag2 || !flag ) { if(vec.size()) { return vec[i-2][0]; } else return ""; } else { vec.push_back(temp); } } return ""; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix