题目
在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是“夫妻相”。所谓“夫妻相”,就是两个人看上去比较般配,长相、身材等某些方面有一定的相似度。
本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具“夫妻相”的人。
题目中预先给定一组女士的姓名拼音。输入男士的姓名拼音(拼音中间可以有空格,字母全部小写),依预先给定姓名拼音的先后遍历所有姓名,输出字母重复数最多的女士姓名。
规则1:如果字母重复数最多的女士有多位相同,则以最先匹配的女士做为最具“夫妻相”的人选。
规则2:人名中的相同字母,按重复一次处理。例如:li ling 与li lei 重复的字符个数为2,而不是4。
预置女士名单(先后循序必须保证):
"wang fei",
"zhang man yu",
"zhang zhi yi",
"li li",
"li xiao man",
"li yu cun",
"yang ni",
"xiao tong",
"li lei",
"zhang san"
运行时间限制:
无限制
内存限制:
无限制
输入:
输入一个男士姓名,字符串
输出:
输出最具“夫妻相”的女士姓名
代码
/*---------------------------------------
* 日期:2015-07-07
* 作者:SJF0115
* 题目:姓名的夫妻相
* 来源:华为机试真题
-----------------------------------------*/
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
#define GirlSize 10
string girlName[GirlSize+1] = {"wang fei","zhang man yu","zhang zhi yi","li li","li xiao man","li yu cun","yang ni","xiao tong","li lei","zhang san"};
vector<vector<int> > hash(GirlSize,vector<int>(26,0));
// 预处理女士姓名
void Init(){
for(int i = 0;i < GirlSize;++i){
int count = girlName[i].size();
for(int j = 0;j < count;++j){
if(girlName[i][j] != ‘ ‘){
++hash[i][girlName[i][j] - ‘a‘];
}//if
}//for
}//for
}
string MaxDupicate(string name){
int size = name.size();
// 去掉重复字符
vector<int> boyHash(26,0);
for(int k = 0;k < size;++k){
if(name[k] != ‘ ‘){
++boyHash[name[k] - ‘a‘];
}//if
}//for
int count = 0;
int max = 0;
// 记录重复数最多的女孩下标
int index = 0;
// 比较 获取重复数
for(int i = 0;i < GirlSize;++i){
count = 0;
for(int j = 0;j < 26;++j){
if(hash[i][j] > 0 && boyHash[j] > 0){
++count;
}//if
}//for
// 更新最大值
if(max < count){
max = count;
index = i;
}//if
}//for
return girlName[index];
}
int main(){
string name;
//freopen("C:\\Users\\Administrator\\Desktop\\acm.txt","r",stdin);
// 预处理
Init();
while(getline(cin,name)){
cout<<MaxDupicate(name)<<endl;
}//while
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-07 05:50:22