91词典中最长的单词(720)

作者: Turbo时间限制: 1S章节: 其它

晚于: 2020-09-09 12:00:00后提交分数乘系数50%

问题描述 :

给出一个字符串数组words组成的一本英语词典。从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。

若无答案,则返回空字符串。

示例 1:

输入:

words = ["w","wo","wor","worl", "world"]

输出:"world"

解释: 

单词"world"可由"w", "wo", "wor", 和 "worl"添加一个字母组成。第一个单词是"w",该单词只有一个字母。我们需要从一个字母的单词开始,每步添加一个字母。

示例 2:

输入:

words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]

输出:"apple"

解释:

"apply"和"apple"都能由词典中的单词组成。但是"apple"的字典序小于"apply"。

输入说明 :

首先输入words数组的长度n,范围为[1,1000]。

然后输入n个字符串,每个字符串长度范围为[1,30]。

所有输入的字符串都只包含小写字母。

输出说明 :

输出答案,不包含空格。

如果没有答案,则输出一个空格。

输入范例 :

输出范例 :

#include <iostream>
#include <string>
#include <vector>
#include <unordered_set>
using namespace std;

class Solution {
public:
    string longestWord(vector<string>& words) 
    {
        unordered_set<string> S;
        for(string word:words )
            S.insert(word);
        string res="";
        for(string word:words)
        {
            if(word.size()>res.size()||(word.size()==res.size()&&word.compare(res)<0))
            {
                bool flag=true;
                for(int i=1;i<word.size();i++)
                {
                    string temp=word.substr(0,i);
                    if(S.count(temp))
                        continue;
                    else
                    {
                        flag=false;
                        break;
                    }
                }
                if(flag)
                    res=word;
            }
            
        }
        return res;
    }
};
int main()
{
    string str;
    vector<string> words;
    int n;
    cin>>n;

    for(int i=0; i<n; i++)
    {
        cin>>str;
        words.push_back(str);
    }
    string res=Solution().longestWord(words);
    cout<<res;
    return 0;
}



/*
class Solution {
public:
    string longestWord(vector<string>& words) 
    {
        unordered_set<string> set1;   //不需要排序,所以用unordered_map效率更高
        for(string word : words)
        {
            set1.insert(word);         //将words中的每个元素插入set集合
        }
        string res = "";
      //  int count = 0;
        for(string word : words){
            if(word.size() > res.size() || (word.size() == res.size() && word.compare(res) < 0))
            { //只考虑比当前res长 或者和res一样长且字典序比res小的string元素
                bool flag = true;
                for(int i = 1; i < word.size(); ++i)
                {
                    string tmp = word.substr(0, i);   //取前缀,前缀长度累增
                    if(set1.count(tmp))   //如果前缀在set集合中,那么就继续
                    continue;
                    else
                    {                   //前缀不在,说明不符合要求,立即跳出
                        flag = false;
                        break;
                    }
                }
                if(flag)
                res = word;
            }
        }
        return res;
    }
};
*/
原文地址:https://www.cnblogs.com/zmmm/p/13654921.html