試題 歷屆試題 正則問題
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
考慮一種簡單的正則表達式:
只由 x ( ) | 組成的正則表達式。
小明想求出這個正則表達式能接受的最長字符串的長度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最長字符串是: xxxxxx,長度是6。
輸入格式
一個由x()|組成的正則表達式。輸入長度不超過100,保證合法。
輸出格式
這個正則表達式能接受的最長字符串的長度。
樣例輸入
((xx|xxx)x|(x|xx))xx
樣例輸出
6
數據規模與約定
峯值內存消耗(含虛擬機) < 256M
CPU消耗 < 1000ms
備註
參考鏈接
使用了這位大佬的思路,但他的寫的代碼好像和藍橋杯這個有點不搭嘎。
可能有人回有疑問遞歸的出口在哪裏拿樣本例子來解讀一下,當括號內容全部結束時返回到第一個的dfs()的count+=dfs(),此時count=4;然後繼續循環一直循環到ch=’\n’(getchat()會把回車當成一個字符讀入)時候(此時count=6)進入if,else語句(比較max和count)返回最大值。
代碼
#include<stdio.h>
int dfs(){
char ch;
int max=0,count=0;// max用來保存count用來記數
while(1){
ch=getchar();// 每次循環讀取一個字符
if(ch=='x') count++;//
else if(ch=='|'){// 遇到|就保存|之前最大的長度並且計步器清0
max=(max>count)?max:count;
count=0;
}else if(ch=='(') count+=dfs();// 遇到(遞歸
else{// 遇到)就返回最大,最後一個字符爲\n就是遞歸的出口
max=(max>count)?max:count;
printf("max=%d\n",max);
return max;
}
}
}
int main(){
printf("%d",dfs());
return 0;
}