題目原文鏈接如下:LINK
大致描述一下題目的意思,有[0-9],[a-z],[A-Z]範圍內的字符表示顏色,現在輸入兩個字符串,題目保證字符串只有這些字符,第一個字符串是攤主的串,第二個字符串是小紅想做的手鍊的串,如果攤主的串中所包含的顏色全部包含了小紅要做手鍊的顏色,並且攤主手鍊中每個顏色的數目大於小紅需要的改顏色珠子的數目,輸出"Yes + 攤主串子裏做完小紅的手鍊還剩的珠子數",反之,輸出"No + 小紅還需要的珠子數目"
解題思路:遍歷兩個字符串,把小紅所需要的那個字符串str2裏的每個元素一次去代表攤主珠串的字符串str1中遍歷,如果找到第一個相等的字符,把兩個字符都設置爲'*',當然任意不在題目給定字符範圍內的都可以。遍歷完之後,得到兩個新的字符串str1和str2,這個時候我們設置兩個計數器count1和count2,先去遍歷str2字符串,看裏面有沒有不是'*'的元素,有則count2++,輸出No和count2,然後去遍歷str1字符串,看裏面有沒有不是'*'的元素,有則count1++,輸出Yes和count1.
代碼如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string sell, buy;
while (cin >> sell >> buy)
{
int remain = 0, need = 0;
for (size_t i = 0; i < buy.length(); i++)
{
for (size_t j = 0; j < sell.length(); j++)
{
if (buy[i] == sell[j])
{
buy[i] = '*';
sell[j] = '*';
}
}
}
for (size_t i = 0; i < buy.length(); i++)
{
if (buy[i] != '*')
need++;
}
for (size_t j = 0; j < sell.length(); j++)
{
if (sell[j] != '*')
remain++;
}
if (need != 0)
cout << "No " << need << endl;
else
cout << "Yes " << remain << endl;
}
return 0;
}
最後,附加一個彩蛋,在使用VS調試的時候,被改寫後的字符串真的很萌~~
初始輸入:
處理以後: