【LeetCode每日一题】720:词典中最长的单词

155 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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. 判断当前字符串是否由词典中其他单词逐步添加一个字母组成
  2. 如果条件1满足,则判断是否是最长的字符串,如果不是则更新。
  3. 如果和原来保存的字符串长度相同,则判断是否是字典序最小

通过上述三步操作,则可得到答案。

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;
    }
};