题目链接
来源:牛客网
问题描述:
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一 下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。 |
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以买,因为包含了 全部她想要的珠子,还多了8颗不需要的珠子;ppRYYGrrYB225不能买,因为没有黑色珠子,并且少了一颗红色的珠子。 输入描述: 每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。 |
输出描述:
如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。 示例1 输入 ppRYYGrrYBR2258 YrR8RrY 输出 Yes 8 |
问题分析
这个问题其实就是关于字符查找的问题,一串成品的珠子为源字符串(src),小红想要的珠子为目标字符串(target),其实就是在源字符串中匹配target中字符,且因为小红想要的珠子可能存在重复的,所以不仅target中字符要在src中存在,而且数量还要足够多。 |
- 又因为输入的有限个字符,因为 0~9,a~z,A~Z 这些有效字符对应的ASCII码在 48到122之间
- 所以用一个大小为123哈希表,来保存src字符串中的字符存在个数
- 然后遍历target中的字符,看对应的哈希表中这一个字符数量是否为0
- 不为0,就说明src中存在这个珠子,然后将哈希表中这一字符数量个数减一
- 为0,据说名小红想要的这个珠子不存在,就标记为缺少。
- 这样在遍历完target字符串后,我们根据是否缺少珠子来看小红有没有必要买这串珠子
#include <stdio.h>
#include <vector>
#include <stding>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
string src;
string target;
while(cin >> src)//输入源字符串
{
cin >> target;//输入目标字符串
size_t src_len = src.size();
size_t target_len = target.size();
vector<int> v1;//定义一个哈希表
//因为 0~9,a~z,A~Z 这些有效字符对应的ASCII码在 48到122之间
//所以用一个大小为123哈希表,来保存src字符串中的字符存在个数
v1.resize(123);
//这里采用resize()会将顺序表元素全部初始化初始化为0
int i = 0;
//用哈希表来保存src字符串信息
for(i = 0; i < src_len; ++i)
{
v1[src[i]]++;
}
int lack = 0;//用来保存缺少的字符个数
//遍历target字符串
for(i = 0; i < target_len; ++i)
{
if(v1[target[i]] == 0)
{
lack++;//src中不存在该字符
}
else
{
v1[target[i]]--;//src中存在该字符
}
}
if( lack == 0)
{//可以购买
size_t len = src_len - target_len;
cout<< "Yes"<<" "<<len<<endl;
}
else
{//没必要购买
cout<<"No"<<" "<<lack<<endl;
}
}
return 0;
}
完。