持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
LeetCode每日一题打卡专栏正式启动!不出意外将日更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] 都只包含小写字母。
题解:哈希
题目需要判断是否存在一个单词,它由词典中其他单词逐步添加一个字母组成。同时它的长度最长,且字典序最小。
我们可以通过set保存词典中所有的字符串,然后遍历所有的字符串
- 判断当前字符串是否由词典中其他单词逐步添加一个字母组成
- 如果条件1满足,则判断是否是最长的字符串,如果不是则更新。
- 如果和原来保存的字符串长度相同,则判断是否是字典序最小
通过上述三步操作,则可得到答案。
class Solution {
public:
string longestWord(vector<string>& words) {
int n=words.size();
set<string> st;
for(int i=0;i<n;i++) st.insert(words[i]);
string ans="";int maxlen=0,len;
for(int i=0;i<n;i++){
len=words[i].length();
//首先判断是否由词典中其他单词逐步添加一个字母组成
bool flag=true;
for(int j=0;j<len-1;j++){
if(!st.count(words[i].substr(0,j+1))){
flag=false;break;
}
}
if(flag){
//判断是否最长
if(len>maxlen){
ans=words[i],maxlen=len;
}else if(len==maxlen){
//判断是否字典序最小
if(ans=="") ans=words[i],maxlen=len;
else if(ans>words[i]) ans=words[i],maxlen=len;
}
}
}
return ans;
}
};