這道題一共有三個規則:測試
- 字符串中必須僅有P, A, T這三種字符,不能夠包含其它字符;
- 任意形如 xPATx 的字符串均可以得到「答案正確」,其中 x 或者是空字符串,或者是僅由字母 A 組成的字符>串;
- 若是 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a, b, c 均或者是空字符串,或者是僅由字母 A 組>成的字符串。
咱們先假設一個組合—— xPATy, x, y表示的是x, y個A的組合,好比:2PAT2 表明的是 AAPATAA。
有了這個組合,接下來分析就很方便了。
---code
看出關係了嗎? 左邊A數量=中間A數量*右邊A數量,上面3個都是知足這個公式的。那麼代碼裏,咱們就把三個位置A的數量記錄下來,判斷是否知足公式就好了。字符串
有兩個測試點是我本身作的時候卡了半天的:
PT
APATAA
你們寫的時候注意一下string
廢話很少說,上代碼io
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char str[100]; int n; int isRight = 0; // 判斷是否正確的標誌 int str_len; int i, j; int num_A1, num_A2, num_A3; // 分別爲P前面的A數量,中間數量,T後面的A數量 int temp; scanf("%d", &n); char *answer[n]; // 用來保存答案 for (i = 0; i < n; i++) { scanf("%s", str); num_A1 = num_A2 = num_A3 = 0; str_len = strlen(str); for (j = 0; j < str_len; j++) { // 咱們根據規則,在遇到P以前。必須是A或者空字符,一旦出現A或P以外的,直接GG if (str[j] != 'A' && str[j] != 'P') { isRight = 0; break; } // 開始統計P前面A的數量了 if (str[j] == 'A') { num_A1++; } // 遇到P了,開始判斷是否符合規則,若是此次不符合,就沒有下次了 if (str[j] == 'P') { for (j; j < str_len; j++) { // 統計中間A的數量 if (str[j] == 'A') { num_A2++; } // 碰到T,說明該結束了,就看T後面的A夠不夠了 if (str[j] == 'T') { // A都沒有,直接GG if (num_A2 == 0) break; j += 1; // 若是字符串到temp還不結束,那就說明符合規則的A數量字符後面還有東西,這不是破壞了前面的陣型了嘛,GG temp = j + num_A1 * num_A2; if (str_len > temp) break; // 統計T後面A的數量滿不知足規則要求的數量 for (j; j < temp; j++) { if (str[j] == 'A') { num_A3++; } } // 這就是我總結規則得出來的三個位置A的數量關係,知足了就行了,並且一旦這個知足,字符串也就到頭了 if (num_A3 == num_A1 * num_A2 && j == str_len) { isRight = 1; } } } } } if (isRight == 0) { answer[i] = "NO"; } else { answer[i] = "YES"; } isRight = 0; } for (i = 0; i < n; i++) { printf("%s\n", answer[i]); } return 0; }