題目敘述
題目採EOF方式收資料,每筆資料會有兩行字串,當第一個字串為「STOP!!」時停止收資料。要求輸出如果將兩個字串排序過後可不可以變成一樣的字串,可以的話則輸出「yes」,反之則輸出「no」。
範例輸入
e83k
38ek
asdfghjkl;'
';lkjhgfdsa
1234
4521
_01=1
_=110
SToP!!
stop!!
STOP!!
範例輸出
yes
yes
no
yes
no
解題思路
本題需使用cin優化/scanf才不會TLE (cin優化詳情請見範例程式碼),另外收到兩組字串過後可以先判斷兩個字串的長度是否相同,如果不相同的話直接輸出no節省時間。可以使用For迴圈將每個字串中的字元做處理,使用一個Map存每個字元出現的次數。假設兩個字串的名稱叫做A和B,把A的每個字元的Map值做+1、把B的每個字元的Map值做-1。之後使用 for (auto it:MAP) 來將Map中的資料做判斷,使用for (auto it:MAP) 的時候it這個變數會變成一個pair,所以只要判斷it.second是否為0,如果有不是0的話就輸出no並將For迴圈break掉節省時間,如果都是0的話就輸出yes。
解題程式碼如下 (僅供參考):
#include <iostream>
#include <map>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
string a;
while (cin >> a && a != "STOP!!")
{
string b;
cin >> b;
if (a.length() != b.length()) cout << "no\n";
else
{
map<char, int>MAP;
for (int i = 0; i<a.length(); i++)
{
MAP[a[i]]++;
MAP[b[i]]--;
}
bool yes = true;
for (auto it:MAP)
{
if (it.second != 0)
{
cout << "no\n";
yes = false;
break;
}
}
if (yes) cout << "yes\n";
}
}
}
留言
張貼留言