Pat練習 1003 我要通過

2022-09-09 08:57:14 字數 3273 閱讀 6020

題目

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

得到「答案正確」的條件是:

字串中必須僅有pat這三種字元,不可以包含其它字元;

任意形如xpatx的字串都可以獲得「答案正確」,其中x或者是空字串,或者是僅由字母a組成的字串;

如果apbtc是正確的,那麼apbatca也是正確的,其中abc均或者是空字串,或者是僅由字母a組成的字串。

現在就請你為 pat 寫乙個自動裁判程式,判定哪些字串是可以獲得「答案正確」的。

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

每個字串的檢測結果佔一行,如果該字串可以獲得「答案正確」,則輸出yes,否則輸出no

輸入樣例:

10pat

paat

aapataa

aapaataaaa

xpatx

ptwhatever

apaaataa

aptapattaa

結尾無空行

輸出樣例:

yesyes

yesyes

nono

nono

nono

結尾無空行

先分析一下3個條件

1:包含pat這3個字元,不可以有其他的sdad什麼的等等

2:也就是說pat、apata、aaapataaa、n*apatn*a都是正確的

3: apbtc 與apbatca 都是正確的 ,來看看 如果把pt作為分段的

也就是 ap b tc ~~ap ba tca其實是等價的

因為這裡是字串,那麼看到最後的c 和ca ,想想有沒有可能有倍數關係

那麼有 a、b、c要麼為空 要麼為n*a

再結合例子的正確答案來看

p前面稱為a段、pt之間稱為b段、t後面稱為c段

也就是b段的長度乘以a段所表示的n*a應該是和後面的c段相等

也就是:

c = len(b)*a 

我們可以利用這個推論進行資料匹配,那麼用正則是最好的方法

正則的定義:

這裡需要用到:

*表示前乙個字元的0次或者無限次擴充套件

+前乙個字元的一次或無限次擴充套件

匹配規則也就是 a*pa+ta*

.表示任何單個字元

[ ] 字符集,對單個字元給出取值範圍 [abc]表示a,b,c [a-z]表示a到z的所有單個字元

[^] 非字符集,對單個字元給出排除範圍 [^abc]表示非a或b或c的單個字元

* 前乙個字元的零次或無限次擴充套件 abc*表示ab,abc,abcc,abccc等

+ 前乙個字元的一次或無限次擴充套件 abc+表示abc,abcc,abccc等

? 前乙個字元零次或一次擴充套件 abc?表示ab,abc

| 左右表示式任意乙個 abc|def表示abc,def

擴充套件前乙個字元m次 abc表示abbc

擴充套件前乙個字元m至n次(含n次) ab表示abc,abbc

^ 匹配字串開頭 ^abc表示abc且在乙個字串的開頭

$ 匹配字串結尾 abc

$表示abc且在乙個字串的結尾

() 分組標記,內部只能使用|操作符 (abc)表示abc,(abc|def)表示abc,def

\d 數字,等價於[0-9]

然後需要用pt分片也就是 | [p|t]

split分割方法

re.split分割和一般的split還不一樣

re.split(pattern, string[, maxsplit=0, flags=0])
pattern:匹配的字串

string:需要切分的字串

maxsplit:分隔次數,預設為0(即不限次數)

flags:標誌位,用於控制正規表示式的匹配方式,比如:是否區分大小寫,多行匹配等

一般的split則是

str.split(str="", num=string.count(str))

str= "line1-abcdef \nline2-abc \nline4-abcd"

printstr.split()# 以空格為分隔符,包含 \n

printstr.split('', 1)# 以空格為分隔符,分隔成兩個

這裡以a為分割符 分割2次

所以**是:

import

redef

check(n):

s =list()

for i in

range(0, n):

for i in

range(0, n):

if re.match(r'

a*pa+ta*

', s[i]):

#根據推論來寫正則匹配

a = re.split(r'

[p|t]

', s[i])

#通過split 以pt來分割 也就會被分割成3份

#a段 b段 c段

if a[2] == a[0] * len(a[1]):

print('

yes'

)

else

:

print('no'

)

else

:

print('no'

)if__name__ == '

__main__':

n =int(input())

check(n)

PAT乙級 1003 我要通過

考察了分而治之的思想。題目的表述讓我聯想起表示式的bnf描述 乙個數是表示式 在表示式兩邊加個括號也是表示式 兩個表示式相加也是表示式 接下來你全懂了 實際上就是按照題目要求,將檢查指標細分,以求達到庖丁解牛 逐個擊破的效果。源 c include include 得到 答案正確 的條件是 字串中必...

PAT 1003 我要通過!

深刻理解 如果 apbtc 是正確的,那麼 apbatca 也是正確的 可以用數學表示式寫為 a b 1 c a 其中a,b,c,1均為含有字元 a 的個數 故可得len a len b len c 上 思路仿寫了另一位博主的 include include using namespace std ...

PAT 1003 我要通過!

答案正確 是自動判題系統給出的最令人歡喜的回覆。本題屬於pat的 答案正確 大派送 只要讀入的字串滿足下列條件,系統就輸出 答案正確 否則輸出 答案錯誤 得到 答案正確 的條件是 1.字串中必須僅有p,a,t這三種字元,不可以包含其它字元 2.任意形如 xpatx 的字串都可以獲得 答案正確 其中 ...