1. 程式人生 > 其它 >攻破演算法題_雜湊_PAT_B1029_到底買不買(20)

攻破演算法題_雜湊_PAT_B1029_到底買不買(20)

題目:

小紅想買些珠子做一串自己喜歡的珠串。賣珠子的攤主有很多串五顏六色的珠串,但是不肯把任何一串拆散了賣。於是小紅要你幫忙判斷一下,某串珠子裡是否包含了全部自己想要的珠子?如果是,那麼告訴她有多少多餘的珠子;如果不是,那麼告訴她缺了多少珠子。

為方便起見,我們用[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

演算法思路:

  1. 輸入第一串字串,定義一個hashTable[80]分別表示62種顏色(0 - 9、a - z、A - Z)
    每輸入一個字元,對應的hashTable[index]++,輸入完成後,便儲存了第一條字串中各珠顏色出現的次數
  2. 輸入第二串字串,定義變數miss=0,表示缺失的珠子數
    每輸入一個字元,對應的hashTable[index]–,若hashTable[index]<0,則miss++,表示缺失的珠子數+1
  3. 若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; }