给定一个字符串列表,找出单词中最长单词,可以用l列表中的其他单词一次构建一个字符。返回具有最小字典顺序的最长单词。
2017-11-13 12:01
483 查看
本题源自leetcode
---------------------------------------------------------------------------------------
思路:
1 先对字符串列表的单词排序。
2 然后遍历每一个字符串,用有序表set存储。如果这个单词的前缀在set中出现过或者单词长度为1,就插入到set
3 选出最长的字串
代码:
string longestWord(vector<string>& words) {
string res="";
sort(words.begin(),words.end());
unordered_set<string> s;
for(string word:words){
if(word.size()==1||s.count(word.substr(0,word.size()-1))){
res=res.size()<word.size()?word:res;
s.insert(word);
}
}
return res;
}
代码2:
struct strComp{
bool operator()(auto &l1,auto &l2)const{
if(l1.size()>l2.size())
return true;
else if(l1.size()==l2.size())
return l1<l2;
return false;
}
};
string longestWord(vector<string>& words) {
string res="";
if(words.size()==0)
return res;
set<string,strComp> s(words.begin(),words.end());
for(auto& word : s){
int i=1;
for(;i<word.size();i++){
string str=word.substr(0,i);
if(s.find(str)==s.end())
break;
}
if(i==word.size())
return word;
}
return res;
}
---------------------------------------------------------------------------------------
思路:
1 先对字符串列表的单词排序。
2 然后遍历每一个字符串,用有序表set存储。如果这个单词的前缀在set中出现过或者单词长度为1,就插入到set
3 选出最长的字串
代码:
string longestWord(vector<string>& words) {
string res="";
sort(words.begin(),words.end());
unordered_set<string> s;
for(string word:words){
if(word.size()==1||s.count(word.substr(0,word.size()-1))){
res=res.size()<word.size()?word:res;
s.insert(word);
}
}
return res;
}
代码2:
struct strComp{
bool operator()(auto &l1,auto &l2)const{
if(l1.size()>l2.size())
return true;
else if(l1.size()==l2.size())
return l1<l2;
return false;
}
};
string longestWord(vector<string>& words) {
string res="";
if(words.size()==0)
return res;
set<string,strComp> s(words.begin(),words.end());
for(auto& word : s){
int i=1;
for(;i<word.size();i++){
string str=word.substr(0,i);
if(s.find(str)==s.end())
break;
}
if(i==word.size())
return word;
}
return res;
}
相关文章推荐
- 2018阿里校招笔试——给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
- 给定一个只包含小写字母的字符串,删除重复的字母,每个字母只出现一次。在所有结果中,输出字典顺序最小的。
- 阿里校招笔试——给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
- 程序员面试金典——解题总结: 9.18高难度题 18.7给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
- 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。
- 给定一个字符串s,找出s中最长的回文子串,你可以假设s的最大长度是1000。
- 给定一个字符串,返回字符串中没有重复字符的最长子串的长度
- 给定一个字符串,你需要颠倒每个单词中的字符顺序,同时仍然保留空白和初始的字顺序。
- [转]给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词
- 给定一个字符串a,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长? 输出需要删除的字符个数。
- 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
- 翻转子串 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
- 给定一个字符串,你需要颠倒一个句子中每个单词中的字符顺序,同时保留空格和初始单词顺序。
- 给你一个字符串s和一个长度相同的单词列表。 找出s中所有子字符串的起始索引,这些字符串中的每个单词只是一个字符串,没有任何中介字符。
- 给定一个字符串s和一个单词dict的字典,确定s是否可以分割成一个或多个字典单词的空格分隔的序列。 s ="leetcode", dict =["leet", "code"].
- 给你一个字符串s和一个长度相同的单词列表。 找出s中所有子字符串的起始索引,这些字符串中的每个单词只是一个字符串,没有任何中介字符。
- 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。
- 给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
- 给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。