前言
小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。
【输入形式】
每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。
【输出形式】
如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。
【样例输入】
ppRYYGrrYBR2258
YrR8RrY
【样例输出】
Yes 8
【样例说明】
【评分标准】
答案
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1,s2;
cin>>s1;
cin>>s2;
int len=s1.length();
/* map<string,int>mp1
map<string,int>mp2
for(int i=0;i<s1.length();i++)
{
mp1[s[i]]++;
}
for(int i=0;i<s2.length();i++)
{
mp2[s[i]]++;
} */
int flag=0,p,queshao_sum=0;
for(int i=0; i<s2.length(); i++)
{
if(s1.find(s2[i])==string::npos)
{
flag=1;
queshao_sum++;
}
else
{
p=s1.find(s2[i]); //一举两得,存在的珠子找到一次删一次,数量不够时就找不见
//则queshao_sum++
s1.erase(p,1);
}
}
if(flag==1)
cout<<"No "<<queshao_sum;
else
cout<<"Yes "<<(len-s2.length());
return 0;
}
第二种
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1,s2;
cin>>s1;
cin>>s2;
int len=s1.length();
/* map<string,int>mp1
map<string,int>mp2
for(int i=0;i<s1.length();i++)
{
mp1[s[i]]++;
}
for(int i=0;i<s2.length();i++)
{
mp2[s[i]]++;
} */
int flag=0,p,queshao_sum=0;
for(int i=0; i<s2.length(); i++)
{
if(s1.find(s2[i])==string::npos)
{
flag=1;
queshao_sum++;
}
else
{
p=s1.find(s2[i]); //一举两得,存在的珠子找到一次删一次,数量不够时就找不见
//则queshao_sum++
s1.erase(p,1);
}
}
if(flag==1)
cout<<"No "<<queshao_sum;
else
cout<<"Yes "<<(len-s2.length());
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
map<char,int>mp;
string ans="Yes";
int cha=0;
int flag=1;
for(int i=0; i<a.length(); i++) mp[a[i]]++;
for(int i=0; i<b.length(); i++)
{
if(!mp.count(b[i]))
{
ans="No";
cha++; //没有的珠子 个数
flag=0;
}
else
{
mp[b[i]]--;
if(mp[b[i]]<0)
{
flag=0;
cha++;
}
}
}
/*
for(int i=0; i<b.length(); i++)
{ 这里搞得太麻烦了,以至于出错
if(ans=="Yes")
{
if(mp[b[i]]<0)
{
ans="No";
cha-=mp[b[i]]; //有珠子数量不对
flag=0;
}
}
else
{
if(mp[b[i]]<0)
{
cha-=mp[b[i]];
}
}
}
*/
if(flag==1) cha=a.length()-b.length(); //多的珠子
cout<<ans<<" "<<cha<<endl;
return 0;
}
//借鉴代码 karl
#include<iostream>
#include<string>
using namespace std;
int main()
{
string from,need;//from是店家的珠子,need是我们需要的珠子
cin>>from>>need;
for(int i=0;i<from.size();i++)//遍历店家的珠子
{
int pos=need.find(from[i]);
//判断店家的这颗珠子我们是否需要
if(pos!=string::npos)//如果需要的话
{
from.erase(from.find(need[pos]),1);
//在店家的珠子中删去
need.erase(pos,1);
//在我们需要的珠子中删去
i--;
//这里要人为将i向前一位
//因为erase之后i到了下一个位置
}
}
//根据需要的珠子的个数进行判断并输出
if(need.empty()) cout<<"Yes "<<from.size()<<endl;
else cout<<"No "<<need.size()<<endl;
system("pause");
return 0;
}