最具夫妻相
描述: 在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是“夫妻相”。所谓“夫妻相”,就是两个人看上去比较般配,长相、身材等某些方面有一定的相似度。本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具“夫妻相”的人。题目中预先给定一组女士的姓名拼音。输入男士的姓名拼音(拼音中间可以有空格,字母全部小写),依预先给定姓名拼音的先后遍历所有姓名,输出字母重复数最多的女士姓名。
规则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”
运行时间限制: 无限制
内存限制: 无限制
输入: 输入一个男士姓名,字符串
输出: 输出最具“夫妻相”的女士姓名
样例输入: li si
样例输出: li li
思路:分别用两个哈希表统计男士和女士中出现过的字母,出现了记为1,没出现记为0,然后比较两个哈希表中相同键值对应的值是否都为1,若都为1,则匹配长度加1,如此则可以计算出两个人名字的匹配长度,进而可以找出最大匹配长度的女士。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string females[]={
"wang fei",
"zhang man yu",
"zhang zhi yi",
"li li",
"li xiao man",
"li yu cun",
"yang ni",
"xiao tong",
"li lei",
"zhang san"
};
int countSim(int male[],int female[]){
int res=0;
for(int i=0;i<26;i++){
if(male[i]==1&&female[i]==1)
res++;
}
return res;
}
void findTheBestFemale(string male,string& bestFemale){
int femaleName[10][26];
int maleName[26];
for(int i=0;i<10;i++)
for(int j=0;j<26;j++){
femaleName[i][j]=0; //全部初始化为0
}
for(int i=0;i<26;i++){
maleName[i]=0;
}
for(int i=0;i<10;i++)
{
string names=females[i];
for(int j=0;j<names.size();j++){
if(names[j]<='z'&&names[j]>='a'){
femaleName[i][names[j]-'a']=1;
}
}
}
for(int j=0;j<male.size();j++){
if(male[j]<='z'&&male[j]>='a'){
maleName[male[j]-'a']=1;
}
}
int max=-1;
int index;
for(int i=0;i<10;i++){
int sim =countSim(maleName,femaleName[i]);
if(sim>max){
max=sim;
index=i;
}
}
bestFemale = females[index];
}
int main(void){
string male;
string bestFemale;
while(true)
{
getline(cin,male);
findTheBestFemale(male,bestFemale);
cout<<bestFemale<<endl;
system("pause");
}
return 0;
}