C語言實現 藍橋杯 歷屆試題 正則問題

試題 歷屆試題 正則問題

                                                                                  藍橋杯試題解答彙總鏈接

資源限制

       時間限制: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章