面试题 17.15. 最长单词
给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。
示例:
输入: [“cat”,“banana”,“dog”,“nana”,“walk”,“walker”,“dogwalker”]
输出: “dogwalker”
解释: "dogwalker"可由"dog"和"walker"组成。
提示:
0 <= len(words) <= 200
1 <= len(words[i]) <= 100
题解
这个题目,,,卡了我很久,为啥呢?因为题目没说清楚一个单词能否被多次使用,好家伙,我就一直以为是每个单词只能被使用一次,,,,
AC代码
class Solution {
public:
map<string,int>count;
static int cmp(string s1,string s2)
{
if(s1.length()>s2.length())return true;
if(s1.length()==s2.length())return s1<s2;
return false;
}
bool check(string s,int l)
{
if(l==s.length())return true;
string res = "";
for(int i=l;i<s.length();i++)
{
res += s[i];
if(count.find(res)!=count.end()&&count[res]>0)
{
//count[res]--;
bool back = check(s,i+1);
//count[res]++;
if(back)return true;
}
}
return false;
}
string longestWord(vector<string>& words)
{
sort(words.begin(),words.end(),cmp);
for(int i=0;i<words.size();i++)
{
count[words[i]]++;
}
for(int i=0;i<words.size();i++)
{
count[words[i]]--;
if(check(words[i],0))return words[i];
count[words[i]]++;
}
return "";
}
};