算法訓練 虛張聲勢

問題 2110: 虛張聲勢

時間限制: 1Sec 內存限制: 128MB 提交: 298 解決: 61
題目描述
大戰即將來臨,傑洛特需要爲自己聲張聲勢,但是喊得太假有會被人識破
因此傑洛特決定連着喊出兩句話,兩句話中所有的字母數量全部相等則不會被識破
請指出傑洛特所喊的話是否會被識破
輸入
一個t表示幾組數據
接下來t組,每組第一行一句話,第二行一句話
每句話長度小於100000
輸出
如果傑洛特沒有被識破則輸出"Yes"
如果被識破了則喊出"No"
樣例輸入
2
wj nb
w jnb
Iiread
readii
樣例輸出
Yes
No


在家好無聊,想要上課上課…
題解

  • 把兩句話各存一個string,需要使用getline來讀取,因爲含有空格,然後sort兩個string,之後比較兩者,如果一樣就Yes,否則No。這樣做比較費時間,因爲sort費時間(複雜度爲O(nlogn)),而且需要剔除那些空格字符。(但這不失爲一種好思路,只是本題不推薦使用)
  • 申請兩個26大小的char數組,每有一個字符,就在相應位置 ++,來記錄每一個字母的個數,最後比較這兩個數組是否完全一樣即可。這樣做效率很高。
#include<iostream>
#include<cstring>
#include<string>
using namespace std;

int main( ){
	int a[26], b[26];
	string d;
	int n;

	cin >> n;
	getchar( );
	while(n--){
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));

		getline(cin, d);		//一次讀取
		for(int i = 0; i < d.length(); i++)
			if(d[i] == ' ')		//空格直接continue
				continue;
			else
				a[d[i] - 'a']++;
		getline(cin, d);
		for(int i = 0; i < d.length(); i++)
			if(d[i] == ' ')
				continue;
			else
				b[d[i] - 'a']++;

		bool code = 1;
		for(int i=0;i<26;i++)
			if(a[i] != b[i]){
				code = 0;
				break;
			}
		if(code)
			cout << "Yes" << endl;
		else
			cout << "No" << endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章