Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
思路分析
这道题考察的是对字符串的操作
我使用了哈希数组来记录两个字符串中每个字符出现的次数,bead1[128],bead2[128]分别记录摊主和小红的珠子出现的次数,为什么不统计多余的珠子,是因为如果摊主的字符串包含了全部小红的全部字符串,字符串长度差就是多余的珠子
一些花絮:我使用了引用类型的增强for循环(char& c:s),这样比普通的增强for循环更快,因为普通的增强for循环是复制一个字符串进行遍历,而引用是直接操作,而且可以给要遍历的字符串的赋值,
AC代码
#include<bits/stdc++.h>
using namespace std;
int bead1[128],bead2[128],diff;//diff记录缺少的珠子
int main()
{
bool buy=true;//未缺少字符(珠子)的标志,是否能买
string s1,s2;
cin>>s1>>s2;
for(char& c1:s1)
bead1[c1]++;
for(char& c2:s2)
bead2[c2]++;
for(int i=0;i<128;i++)
if(bead2[i])//小红的珠子存在
{
if(bead1[i]<bead2[i])//摊主的珠子比小红的少
{
buy=false;
diff+=(bead2[i]-bead1[i]);
}
}
if(buy) cout<<"Yes "<<s1.length()-s2.length();//珠子都齐直接输出长度差
else cout<<"No "<<diff;
}
总结
真是三十年河东,三十年河西。
遥想去年看这题还是手足无措,今日视之,亦不过尔尔
学会哈希散列真的好爽哈哈哈