PTA乙級----1003 我要通過

1.題目 :

“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。

得到“答案正確”的條件是:

  1. 字符串中必須僅有 P、 A、 T這三種字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以獲得“答案正確”,其中 x 或者是空字符串,或者是僅由字母 A 組成的字符串;
  3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a、 b、 c 均或者是空字符串,或者是僅由字母 A 組成的字符串。
    現在就請你爲 PAT 寫一個自動裁判程序,判定哪些字符串是可以獲得“答案正確”的。

輸入格式:
每個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (<10),是需要檢測的字符串個數。接下來每個字符串佔一行,字符串長度不超過 100,且不包含空格。

輸出格式:
每個字符串的檢測結果佔一行,如果該字符串可以獲得“答案正確”,則輸出 YES,否則輸出 NO。

輸入樣例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
輸出樣例:
YES
YES
YES
YES
NO
NO
NO
NO

2.分析

看到這題以後我是真的不知道題目說的是什麼意思.後來網上各種找尋大神的答案纔算弄明白,要顯示"通過"必須滿足三個條件

  1. 輸入的字符中只能含有P A T三個字符,出現其它字符即爲"不通過"
  2. 形如xPATx這種形式也是正確的,但是x只能是A或者空
  3. 條件3是最難理解的, 分析一下由aPbTc正確(其中a b c由若干個A組成的字符串) ==>> aPbATac 正確,不難發現,當b每多一個A,那麼右邊也就多出一個a.例如
    aPATc 、 aPAATca 、 aPAAATcaa 由此不難發現 T右邊A的數量是 P左邊A數量的整數倍即a x b = c

由此三個條件的分析可以寫出如下代碼

3.代碼

#include <iostream>
#include <string>
using namespace std;

bool isPAT(string str) {

	int P_i = 0, T_i = 0;		//P_i和T_i分別記錄 P和T 在字符串中的位置
	int count_P = 0, count_T = 0;	//記錄P和T的數量

	for (int i = 0; i < str.length(); i++) {

		if (str[i] != 'P' && str[i] != 'A' && str[i] != 'T') {	//如果不滿足條件1,直接返回false
			return false;
		}

		if (str[i] == 'P') {
			P_i = i;
			count_P++;
		}
		if (str[i] == 'T') {
			T_i = i;
			count_T++;
			break;
		}
	}

//第一個判斷條件是滿足條件3 第二個判斷條件保證PT之間一定要有A
	if (P_i * (T_i - 1 - T_i) == (str.length() - T_i - 1)  && T_i - P_i - 1 > 0 && count_P == 1 && count_T == 1 ) {
		return true;
	}
	else {
		return false;
	}
}


int main() {

	int n;
	string str;
	cin >> n;

	while (n--) {
		cin >> str;
		if (isPAT(str)) {
			cout << "YES" << endl;
		}
		else {
			cout << "NO" << endl;
		}
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章