1. 程式人生 > >正則表示式最大匹配與最小匹配

正則表示式最大匹配與最小匹配

正則表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),是電腦科學的一個概念。正則表示式通常被用來檢索、替換那些符合某個模式(規則)的文字。在正則表示式中通常有某個字元可以匹配若干個字元。假設在某程式設計語言的正則表示式中“*”就可以匹配0個或多個字元。比如a*b可以匹配ab,acb,adb,acdb,adkfjgjdkb等等。在字串acbddbeeebff中,有多個字串可以和a*b匹配,包括acb,acbddb和acbddbeeeb。那麼應該選哪個呢?通常有兩種策略可選,一種是最小匹配,就是選最短的acb;另一種是貪婪匹配,就是選最長的acbddbeeeb。現在就請你寫一段程式根據給定模式串和匹配串分別輸出最小匹配和貪婪匹配的結果。

輸入:
為2行,每行都是一個字串,字串長度均大於等於2且小於等於100。第一行的字串中包含且僅包含一個“*”,為模式串。也就是說這裡的“*”可以匹配0個或多個任意字元。第二行的字串一定不包含“*”,為待匹配串。

輸出:
也為2行,每行都是一個字串。第一行為最小匹配的結果,第二行為貪婪匹配的結果。

注:一、樣例中的最小匹配是aab而不是ab;二本題不允許使用所用語言中現成的字串處理函式或模組;三測試資料保證有解。

 

輸入樣例

a*b
haabaaaabcd

輸出樣例

aab
aabaaaab




#include<stdio.h>
#include
<string.h> static char longout[50]; static char shortout[50]; int main() { char a[4]; int i,j,k; scanf("%s",a); char b[100]; scanf("%s",b); for(i=0;i<strlen(b);i++) { if(b[i]==a[0]) { for(j=i+1;j<strlen(b);j++) {
if(b[j]==a[2]) break; } break; } } for (k=0;i<=j;k++,i++) { shortout[k]=b[i]; } i=0;j=0;k=0; for(i=0;i<strlen(b);i++) { if(b[i]==a[0]) break; } for(j=strlen(b)-1;j>i;j--) { if(b[j]==a[2]) break; } for (k=0;i<=j;k++,i++) { longout[k]=b[i]; } printf("%s\n%s",shortout,longout); }

演算法很簡單,前後分別遍歷查詢

 

c的好多語法資料結構我還不是太清楚,感覺光看了書沒有實踐記不住,應該看些複雜的程式碼記一下了。