题目描述:
给出一个字符串数组words组成的一本英语词典。从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。
若无答案,则返回空字符串。
算法思路:
- 首先需要对words中的元素进行排序
- 设置一个存储结果的变量res,利用set实现保存,去重和排序
- 遍历words中的每一个元素,当满足单词长度为1,或者截取的length-1长度的单词可以在set中找到,我们就将遍历到的这个单词插入到set中,更新res的结果,更新为长度更长的单词。
- 最后返回res即可。
class Solution {
public:
string longestWord(vector<string>& words) {
sort(words.begin(),words.end());//排序
string res = "";//保存结果
set<string> st;//set保存,去重,排序
for(auto it:words){//words遍历每个元素
//如果it的长度为1,插入到set中,又或者从it中截取it.length-1长度的单词,可以在set中找
//到,则将it 插入到set中。长度为1,代表开头,进行逐个单词的查看。count函数此时的作用是在set中查看是否存在某元素。
if(it.length() == 1 || st.count(it.substr(0,it.length()-1) ) == 1){
st.insert(it);
if(it.length() > res.length()){//返回长度更长的结果。
res = it;
}
}
}
return res;
}
};
st.count(it.substr(0,it.length()-1) ) == 1
count()函数返回set中含有元素的个数,由于是set有自动去重的作用,因此也只能返回0或者1,因此可以判断是否有元素的存在。substr()函数截取0到length-1长度的单词在set中查找。