1003 我要通過(guò)! (20 分)
注意:代碼滿分通過(guò)
“答案正確”是自動(dòng)判題系統(tǒng)給出的最令人歡喜的回復(fù)。本題屬于 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件匙铡,系統(tǒng)就輸出“答案正確”撵摆,否則輸出“答案錯(cuò)誤”。
得到“答案正確”的條件是:
1.字符串中必須僅有 P
莉撇、 A
呢蛤、T
這三種字符,不可以包含其它字符棍郎;
2.任意形如 xPATx
的字符串都可以獲得“答案正確”其障,其中 x
或者是空字符串,或者是僅由字母 A 組成的字符串涂佃;
3.如果 aPbTc
是正確的励翼,那么 aPbATca
也是正確的,其中 a
辜荠、 b
汽抚、 c
均或者是空字符串,或者是僅由字母 A
組成的字符串侨拦。
輸入格式:
每個(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.P必須在T的前面
2.P和T之間必須有字符持偏,且一定包含A
3.P與T之間的字符串長(zhǎng)度影響P和T兩側(cè)的字符串長(zhǎng)度。
代碼:
def isValid(s):
x = -1
y = -1
for i in range(len(s)): # 找到P和T的最靠后面的位置
if s[i] == 'P':
x = i
if s[i] == 'T':
y = i
if x == -1 or y == -1: # 如果找不到P或者T則返回False
return False
else:
if x > y: # P在T的后面氨肌,返回False
return False
else: # P在T前面
if y == x + 1: # P鸿秆,T之間沒有字符,返回False
return False
else: # P怎囚,T之間有字符
if x != 0: # 字符串不以P開頭
b = s[0:x]
else: # 字符串以P開頭
b = []
c = s[(x + 1):y]
if y != len(s) - 1: # 字符串不以T結(jié)尾
d = s[(y + 1):len(s)]
else: # 字符串以T結(jié)尾
d = []
# 判斷各個(gè)分段是否是字符A組成
for i in b:
if i != 'A':
return False
for i in c:
if i != 'A':
return False
for i in d:
if i != 'A':
return False
# 條件判斷
if d == b * len(c):
return True
else:
return False
def main():
n = int(input())
line = ''
while n:
line = input()
if isValid(line):
print("YES")
else:
print("NO")
n -= 1
if __name__ == "__main__":
main()
運(yùn)行結(jié)果:
總結(jié)
覺得這道題非常復(fù)雜卿叽,總是漏情況,仔細(xì)審題恳守,并尋找規(guī)律考婴,計(jì)算機(jī)學(xué)科是一個(gè)需要尋找規(guī)律的學(xué)科。
正則表達(dá)式
import re
n = int(input())
for i in range(n):
line = input()
if re.match(r'A*PA+TA*', line): # 在字符串中進(jìn)行匹配
a = re.split(r'[P|T]', line) # 以字符P,T進(jìn)行分段
if a[0] * len(a[1]) == a[2]: # 條件判斷
print('YES')
else:
print('NO')
else:
print('NO')
以上代碼為參考別人所寫催烘,并非CV沥阱,我還自己學(xué)習(xí)了正則表達(dá)式相關(guān)的知識(shí)。正則表達(dá)式學(xué)習(xí)