攻破演算法題_雜湊_PAT_B1029_到底買不買(20)
阿新 • • 發佈:2021-04-03
題目:
小紅想買些珠子做一串自己喜歡的珠串。賣珠子的攤主有很多串五顏六色的珠串,但是不肯把任何一串拆散了賣。於是小紅要你幫忙判斷一下,某串珠子裡是否包含了全部自己想要的珠子?如果是,那麼告訴她有多少多餘的珠子;如果不是,那麼告訴她缺了多少珠子。
為方便起見,我們用[0-9]、[a-z]、[A-Z]範圍內的字元來表示顏色。例如在圖1中,第3串是小紅想做的珠串;那麼第1串可以買,因為包含了全部她想要的珠子,還多了8顆不需要的珠子;第2串不能買,因為沒有黑色珠子,並且少了一顆紅色的珠子。
輸入格式:
每個輸入包含 1 個測試用例。每個測試用例分別在 2 行中先後給出攤主的珠串和小紅想做的珠串,兩串都不超過 1000 個珠子。
輸出格式:
在一行中輸出冠軍隊的編號和總成績,其間以一個空格分隔。注意:題目保證冠軍 隊是唯一的。
輸入樣例 1:
ppRYYGrrYBR2258
YrR8RrY
輸出樣例 1:
Yes 8
輸入樣例 2:
ppRYYGrrYB225
YrR8RrY
輸出樣例 2:
No 2
演算法思路:
- 輸入第一串字串,定義一個hashTable[80]分別表示62種顏色(0 - 9、a - z、A - Z)
每輸入一個字元,對應的hashTable[index]++,輸入完成後,便儲存了第一條字串中各珠顏色出現的次數 - 輸入第二串字串,定義變數miss=0,表示缺失的珠子數
每輸入一個字元,對應的hashTable[index]–,若hashTable[index]<0,則miss++,表示缺失的珠子數+1 - 若miss > 0 則輸出No miss的值(表示有珠子缺失)
否則,輸出Yes 字串1 - 字串2的長度之差
C++實現:
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int hashTable[80];
int stringToint(char c) {
if(c >= '0' && c <= '9') { //數字0 - 9 對應下標 0 - 9
return c - '0';
} else if(c >= 'A' && c <= 'Z') { //字母A - Z對應下標10 - 35
return c - 'A' + 10;
} else { //字母a - z對應下標36 - 71
return c - 'a' + 35;
}
}
int main() {
int index, miss = 0; //字元轉成對應的下標值,缺失的珠子數
string s1,s2;
cin >> s1; //輸入第一串字元
cin >> s2; //輸入第二串字元
for(int i = 0; i < (int)s1.length(); ++i) {
index = stringToint(s1[i]); //字元 - hashTable下標
hashTable[index]++; //該顏色個數+1
}
for(int i = 0; i < (int)s2.length(); ++i) {
index = stringToint(s2[i]); //字元 - hashTable下標
hashTable[index]--; //該顏色個數-1
if(hashTable[index] < 0) {
miss++;
}
}
if(miss > 0) { //出現缺失的珠子數,輸出缺失的數目
cout << "No " << miss << endl;
} else { //若無缺失,輸出兩字串之間的長度差
cout << "Yes " << s1.length() - s2.length() << endl;
}
return 0;
}