ZeroJudge A275: 字串變變變

題目敘述

題目採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";
        }
    }
}

留言