傳送門
https://pintia.cn/problem-sets/994805260223102976/problems/994805283241443328
題目
小紅想買些珠子做一串自己喜歡的珠串。賣珠子的攤主有很多串五顏六色的珠串,但是不肯把任何一串拆散了賣。于是小紅要你幫忙判斷一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告訴她有多少多余的珠子;如果不是,那么告訴她缺了多少珠子。
為方便起見,我們用[0-9]、[a-z]、[A-Z]范圍內的字符來表示顏色。例如在圖1中,第3串是小紅想做的珠串;那么第1串可以買,因為包含了全部她想要的珠子,還多了8顆不需要的珠子;第2串不能買,因為沒有黑色珠子,并且少了一顆紅色的珠子。
輸入格式:
每個輸入包含1個測試用例。每個測試用例分別在2行中先后給出攤主的珠串和小紅想做的珠串,兩串都不超過1000個珠子。
輸出格式:
如果可以買,則在一行中輸出“Yes”以及有多少多余的珠子;如果不可以買,則在一行中輸出“No”以及缺了多少珠子。其間以1個空格分隔。
輸入樣例1:ppRYYGrrYBR2258YrR8RrY
輸出樣例1:Yes 8
輸入樣例2:ppRYYGrrYB225YrR8RrY
輸出樣例2:No 2
分析
先新建珠串表,用于統計同一字母出現的個數,遍歷字符串1,根據每個字符串的ASCII碼,將與ASCII碼對應索引的珠串表的數值自增1,然后按照字符串2,再將對應索引的珠串表的數值自減2,如果等于0,則將缺少珠子的個數自增1。
最后,根據缺少珠子的個數判斷是否缺珠子,如果不缺珠子,輸出兩個字符串長度的差,即為多的珠子數;如果缺珠子,輸出缺少珠子的個數即可。
源代碼
//C/C++實現
#include <iostream>
#include <string>
using namespace std;
int beads[123]; //'z'的ASCII碼是122,所以聲明123個空間
int main(){
string s1, s2;
cin >> s1 >> s2;
for(int i = 0; i < s1.size(); ++i){
++beads[s1[i]];
}
int lack = 0;
for(int i = 0; i < s2.size(); ++i){
if(beads[s2[i]] == 0){
++lack;
}
else{
--beads[s2[i]];
}
}
if(lack == 0){ //全部包含
printf("Yes %d\n", s1.size() - s2.size());
}
else{
printf("No %d\n", lack);
}
return 0;
}