題目
「答案正確」是自動判題系統給出的最令人歡喜的回覆。本題屬於 pat 的「答案正確」大派送 —— 只要讀入的字串滿足下列條件,系統就輸出「答案正確」,否則輸出「答案錯誤」。
得到「答案正確」的條件是:
字串中必須僅有p
、a
、t
這三種字元,不可以包含其它字元;
任意形如xpatx
的字串都可以獲得「答案正確」,其中x
或者是空字串,或者是僅由字母a
組成的字串;
如果apbtc
是正確的,那麼apbatca
也是正確的,其中a
、b
、c
均或者是空字串,或者是僅由字母a
組成的字串。
現在就請你為 pat 寫乙個自動裁判程式,判定哪些字串是可以獲得「答案正確」的。
每個測試輸入包含 1 個測試用例。第 1 行給出乙個正整數 n (≤10),是需要檢測的字串個數。接下來每個字串佔一行,字串長度不超過 100,且不包含空格。
每個字串的檢測結果佔一行,如果該字串可以獲得「答案正確」,則輸出yes
,否則輸出no
。
輸入樣例:先分析一下3個條件10pat
paat
aapataa
aapaataaaa
xpatx
ptwhatever
apaaataa
aptapattaa
結尾無空行
輸出樣例:
yesyes
yesyes
nono
nono
nono
結尾無空行
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*
.表示任何單個字元然後需要用pt分片也就是 | [p|t][ ] 字符集,對單個字元給出取值範圍 [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]
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))這裡以a為分割符 分割2次str= "line1-abcdef \nline2-abc \nline4-abcd"
printstr.split()# 以空格為分隔符,包含 \n
printstr.split('', 1)# 以空格為分隔符,分隔成兩個
所以**是:
importredef
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 的字串都可以獲得 答案正確 其中 ...