您的位置:首页 > 职场人生

程序员面试金典——解题总结: 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐