題目鏈接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192
“答案正確”是自動(dòng)判題系統(tǒng)給出的最令人歡喜的回復(fù)。本題屬于 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件,系統(tǒng)就輸出“答案正確”租幕,否則輸出“答案錯(cuò)誤”引瀑。
得到“答案正確”的條件是:
字符串中必須僅有 P、 A、 T這三種字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以獲得“答案正確”俏扩,其中 x 或者是空字符串,或者是僅由字母 A 組成的字符串弊添;
如果aPbTc 是正確的录淡,那么 aPbATca 也是正確的,其中 a油坝、 b嫉戚、 c 均或者是空字符串,或者是僅由字母 A 組成的字符串免钻。
現(xiàn)在就請(qǐng)你為 PAT 寫一個(gè)自動(dòng)裁判程序彼水,判定哪些字符串是可以獲得“答案正確”的。
輸入格式:
每個(gè)測(cè)試輸入包含 1 個(gè)測(cè)試用例极舔。第 1 行給出一個(gè)正整數(shù) n (<10)凤覆,是需要檢測(cè)的字符串個(gè)數(shù)。接下來(lái)每個(gè)字符串占一行拆魏,字符串長(zhǎng)度不超過(guò) 100盯桦,且不包含空格慈俯。
輸出格式:
每個(gè)字符串的檢測(cè)結(jié)果占一行,如果該字符串可以獲得“答案正確”拥峦,則輸出 YES贴膘,否則輸出 NO。
輸入樣例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
輸出樣例:
YES
YES
YES
YES
NO
NO
NO
NO
分析
條件1:意思很清楚略号,具體實(shí)現(xiàn)就是字符串中P A T三個(gè)字母數(shù)量之和等于字符串總長(zhǎng)度刑峡。
條件2:xPATx是符合要求的,x可以為空字符串或僅由A組成的字符串玄柠,而且要注意PAT左右兩側(cè)的x必須是一樣的突梦,形如PAT、APATA羽利、AAPATAA等都是正確的宫患。
條件3:這個(gè)條件稍微有點(diǎn)復(fù)雜。如果aPbTc是正確的这弧,則aPbATca也是正確的娃闲,仔細(xì)比較這兩個(gè)字符串,可以發(fā)現(xiàn)每在aPbTc中的P匾浪、T之間加一個(gè)A皇帮,就要在末尾c后面加上P之前的a才能形成正確的字符串。b最簡(jiǎn)單可以為A户矢,這時(shí)APATA是正確的玲献。如果在中間加上一個(gè)A變成APAATA,就需要再在末尾加上一個(gè)a(本例中為A)變成APAATAA才能變?yōu)檎_的梯浪。再比如AAPATAA為正確,在中間加一個(gè)A變?yōu)锳APAATAA瓢娜,末尾也要加上a(本例中為AA)變?yōu)锳APAATAAAA才是正確的挂洛。可以觀察到眠砾,形如aPbTc的字符串虏劲,c要等于b長(zhǎng)度個(gè)a,即c = a*len(b)褒颈。
Python代碼
n = eval(input())
for i in range(n):
s = input()
n_p = s.count('P')
n_t = s.count('T')
n_a = s.count('A')
p_idx = s.find('P')
t_idx = s.find('T')
s1 = s[:p_idx] #s1, s2, s3即組成了形如s1Ps3Ts2的字符串
s2 = s[t_idx+1:]
s3 = s[p_idx+1:t_idx]
if sum([n_p, n_a, n_t]) != len(s):
print('NO')
elif n_p != 1 or n_t != 1:
print('NO')
elif t_idx < p_idx or s2 != s1*s3.count('A') or len(s3) == 0:
print('NO')
else:
if(s1.count('A') != len(s1) or s2.count('A') != len(s2) or s3.count('A') != len(s3)):
print('NO')
else:
print('YES')
回顧
其實(shí)這道題最為重要的是要提煉出“形如aPbTc的字符串柒巫,c要等于b長(zhǎng)度個(gè)a,即c = a*len(b)”這個(gè)條件谷丸,條件2和條件3都可以概括為這個(gè)條件堡掏。而其余的條件也要注意,不要漏掉刨疼。