[华为机试真题]69.姓名的夫妻相

题目

在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是“夫妻相”。所谓“夫妻相”,就是两个人看上去比较般配,长相、身材等某些方面有一定的相似度。
本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具“夫妻相”的人。
题目中预先给定一组女士的姓名拼音。输入男士的姓名拼音(拼音中间可以有空格,字母全部小写),依预先给定姓名拼音的先后遍历所有姓名,输出字母重复数最多的女士姓名。

规则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;
}

你可能感兴趣的:(华为机试真题)