题目描述:
思路:
1、使用哈希表记录每个单词出现的次数;
2、单词长度从小到大排序,使得最长的单词在最后面;
3、然后从后面的开始判断,当后面的单词符合要求(它少一个末尾的单词都能在数组中出现),比前一个长度短的单词符合要求时,则出去这个单词,剩下的单词符合要求,放在vector中;
4、再把符合要求的单词,找出词典顺序在前面的单词;
代码如下:
class Solution {
public:
string longestWord(vector<string>& words) {
map<string,int> cnt;
vector<string>res;
for(int i=0;i<words.size();i++){
cnt[words[i]]++;
}
for(int i=0;i<words.size();i++){
for(int j=i+1;j<words.size();j++){
if(words[i].size()>words[j].size()){
string c=words[i];
words[i]=words[j];
words[j]=c;
}
}
}
for(int i=words.size()-1;i>=0;i--){
int flag1=1;
int flag2=1;
string str=words[i];
for(int j=0;j<words[i].size()-1;j++){
str.pop_back();
if(cnt[str]==0){
flag1=0;
break;
}
}
if(flag1!=0){
res.push_back(words[i]);
if(words[i].size()<res[0].size()){
res.pop_back();
flag2=0;
}
}
if(flag2==0)
break;
}
if(res.size()==1)
return res[0];
else{
string result;
result=res[0];
for(int i=1;i<res.size();i++){
int m=0;
while(1){
if(result[m]<res[i][m])
break;
if(result[m]>res[i][m]){
result=res[i];
break;}
if(result[m]==res[i][m])
m++;
}
}
return result;
}
}
};