程序员面试金典——解题总结: 9.18高难度题 18.7给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
2017-01-19 15:51
1281 查看
#include <iostream> #include <stdio.h> #include <string> #include <vector> #include <hash_map> #include <algorithm> using namespace std; /* 问题:给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。 分析:请弄清楚被组成的单词也是来自于当前词组中的。 将单词数组按照长度从长到短排序,对每个单词word,以序号i拆分成左右两个字符串, 对于左边的字符串leftWord=word[0...i],判断该字符串是否在单词数组中找到,对于右边的字符串 rightWord=word[i+1...length-1],递归调用判断是否是由其他单词组成 输入: 8(单词数组中元素个数n) it bed side bedroom room a long alongside(n个单词) 输出 alongside(最长的单词) 关键: 1 请弄清楚被组成的单词也是来自于当前词组中的。 将单词数组按照长度从长到短排序,对每个单词word,以序号i拆分成左右两个字符串, 对于左边的字符串leftWord=word[0...i],判断该字符串是否在单词数组中找到,对于右边的字符串 rightWord=word[i+1...length-1],递归调用判断是否是由其他单词组成 2 //判断某个单词能否由单词数组中除自己以外的其他单词组成 bool canBeBuildWord(string& word , vector<string>& words , bool isOriginal, hash_map<string,bool> resultMap) { //如果该单词是被其他单词组成,判断结果;为了防止单词由本身组成,这里用isOriginal标记来表示,单词初次处理为true,必定不会直接返回能够由本身表示 if( resultMap.find(word) != resultMap.end() && !isOriginal ) { return resultMap.find(word)->second; } */ class MySort { public: bool operator()(const string& str1 , const string& str2)const { return str1.length() > str2.length(); } }; //判断某个单词能否由单词数组中除自己以外的其他单词组成 bool canBeBuildWord(string& word , vector<string>& words , bool isOriginal, hash_map<string,bool> resultMap) { //如果该单词是被其他单词组成,判断结果;为了防止单词由本身组成,这里用isOriginal标记来表示,单词初次处理为true,必定不会直接返回能够由本身表示 if( resultMap.find(word) != resultMap.end() && !isOriginal ) { return resultMap.find(word)->second; } //对当前单词,进行分割成左右两部分,然后递归处理 int length = word.length(); for(int i = 1 ; i <= length ; i++) { //分割单词的左边部分 string leftStr = word.substr(0, i); string rightStr = word.substr(i , length - i); //如果左边能够在结果集中找到,并且左边部分能够被其他单词组成,且右边部分能够递归被其他单词组成 if( resultMap.find(leftStr) != resultMap.end() && resultMap.find(leftStr)->second && canBeBuildWord(rightStr , words, false , resultMap) ) { return true; } } //说明当前单词不能被其他单词组成 resultMap.insert(pair<string , bool>(word , false)); return false; } string getLongestWord(vector<string>& words, hash_map<string , bool>& resultMap ) { if(words.empty()) { return ""; } //对字符串按照长度从长到短排序,如果当前字符串能够被其他单词组成,则直接输出 sort(words.begin() , words.end() , MySort()); int size = words.size(); for(int i = 0 ; i < size ; i++) { string word = words.at(i); //判断该单词能否由其他单词组成 if(canBeBuildWord(word , words, true , resultMap)) { return word; } } return ""; } void process() { int wordNum; vector<string> words; string word; hash_map<string , bool> wordMap;//键是单词,值如果为true:表示该单词可以由其他单词组成 while(cin >> wordNum) { words.clear(); wordMap.clear(); for(int i = 0 ; i < wordNum ; i++) { cin >> word; words.push_back(word); wordMap.insert(pair<string,bool>(word , true));//设置每个单词都初始化为可由其他单词组成 } //下面开始寻找单词 string result = getLongestWord(words , wordMap); cout << result << endl; } } int main(int argc , char* argv[]) { process(); getchar(); return 0; }
相关文章推荐
- 给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
- 程序员面试金典——解题总结: 9.18高难度题 18.12给定一个正整数和负整数组成的N*M矩阵,编写代码找出元素总和最大的子矩阵。
- 程序员面试金典——解题总结: 9.18高难度题 18.11给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出四条边都是黑色像素的最大子方阵。
- 程序员面试金典——解题总结: 9.18高难度题 18.9随机生成一些数字并传入某个方法。编写一个程序,每当收到新数字时,找出并记录中位数。
- 程序员面试金典——解题总结: 9.18高难度题 18.10给定两个字典里的单词,长度相等。编写一个方法,将一个单词变换成另一个单词,一次只改动一个字母。
- 程序员面试金典——解题总结: 9.18高难度题 18.5有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离
- 程序员面试金典——解题总结: 9.18高难度题 18.1编写一个函数,将两个数字相加。不得使用+或其他算术运算符。
- 程序员面试金典——解题总结: 9.18高难度题 18.13给定一份几百万个单词的清单,设计一个算法,创建由字母组成的最大矩形
- 程序员面试金典——解题总结: 9.18高难度题 18.6设计一个算法,给定10亿数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。
- 程序员面试金典——解题总结: 9.18高难度题 18.2编写一个方法,洗一副牌。要求做到完美洗牌,换言之,这副牌52!种排列组合出现的概率相同
- 程序员面试金典——解题总结: 9.18高难度题 18.8给定一个字符串s和一个包含较短字符串的数组T,设计一个方法,根据T中的每一个较短字符串,对s进行搜索
- 程序员面试金典——解题总结: 9.17中等难题 17.6给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n - m越小越好,也就是说,找出
- 程序员面试金典——解题总结: 9.18高难度题 18.3编写一个方法,从大小为n的数组中随机选出m个整数。要求每个元素被选中的概率相同。
- 程序员面试金典——解题总结: 9.17中等难题 17.4编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。
- 程序员面试金典——解题总结: 9.18高难度题 18.4编写一个方法,数出0到n(含)中数字2出现了几次
- 翻转子串 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
- 程序员面试金典: 9.11 排序与查找 11.5有个排序后的字符串数组,其中散布这一些空字符串,编写一个方法,找出给定字符串的位置
- 程序员面试金典——解题总结: 9.18高难度题 18.8---拓展: 实现一个Trie树
- 程序员面试金典——解题总结: 9.17中等难题 17.8给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和
- 给定一个字符串列表,找出单词中最长单词,可以用l列表中的其他单词一次构建一个字符。返回具有最小字典顺序的最长单词。