1
题目大意:

给出两串珠子中每颗珠子的颜色,问第一串中是否有第二串中的所有珠子,即对每种颜色来说,第一串中该颜色珠子的个数必须不小于第二串中该颜色珠子的个数。如果是,输出“Yes"”,并输出第一串中除了用来和第二串珠子进行匹配以外,还剩多少珠子:如果不是,则输出“No",并输出第串中还少多少个珠子,才能让第一串拥有第二串中的所有珠子。

算法思路:

我们使用counts记录选择的珠子的每一个颜色的珠子出现的次数,然后再遍历第二串珠子,对于每一个珠子我们将其数量减一,表示已获得,如果出现小于0的情况,说明该颜色的珠子数量不够,令isEnough记录为false。最后对于isEnough为true的情况,我们直接将counts数组中每一种颜色的珠子的数目进行累计,对于isEnough为false的情况,我们只累减数目小于0的珠子。这样就得到多出来或者少的珠子数目。

注意点:

1、对于珠子数目充足的情况,可以直接使用长的珠子数目减去短的珠子数目来获得最后多出来的珠子数目。

提交结果:

截屏2020-10-13 上午9.38.47.png

AC代码:
#include <unordered_map>
#include <iostream>

using namespace std;

int main()
{
    string s1,s2;
    cin>>s1>>s2;
    unordered_map<char,int> counts;
    for (int i = 0; i < s1.size(); ++i) {
        ++counts[s1[i]];
    }
    bool isEnough = true;// 是否充足
    for (int j = 0; j < s2.size(); ++j) {
        --counts[s2[j]];
        if(counts[s2[j]]<0){
            isEnough = false;
        }
    }
    int sum = 0;
    unordered_map<char,int>::iterator it;
    if(isEnough){
        //统计多出来的珠子数目
        printf("Yes ");
        for (it=counts.begin();it!=counts.end();++it) {
            sum += it->second;
        }

    } else {
        //统计缺少的珠子数目
        printf("No ");
        for (it=counts.begin();it!=counts.end();++it) {
            if(it->second<0){
                sum -= it->second;
            }
        }
    }
    printf("%d",sum);
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得