請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。
題目描述
請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配
/*
思路:
解這題需要把題意仔細研究清楚,反正我試了好多次才明白的。
首先,考慮特殊情況:
1>兩個字串都為空,返回true
2>當第一個字串不空,而第二個字串空了,返回false(因為這樣,就無法
匹配成功了,而如果第一個字串空了,第二個字串非空,還是可能匹配成
功的,比如第二個字串是“a*a*a*a*”,由於‘*’之前的元素可以出現0次,
所以有可能匹配成功)
之後就開始匹配第一個字元,這裡有兩種可能:匹配成功或匹配失敗。但考慮到pattern
下一個字元可能是‘*’, 這裡我們分兩種情況討論:pattern下一個字元為‘*’或
不為‘*’:
1>pattern下一個字元不為‘*’:這種情況比較簡單,直接匹配當前字元。如果
匹配成功,繼續匹配下一個;如果匹配失敗,直接返回false。注意這裡的
“匹配成功”,除了兩個字元相同的情況外,還有一種情況,就是pattern的
當前字元為‘.’,同時str的當前字元不為‘\0’。
2>pattern下一個字元為‘*’時,稍微複雜一些,因為‘*’可以代表0個或多個。
這裡把這些情況都考慮到:
a>當‘*’匹配0個字元時,str當前字元不變,pattern當前字元後移兩位,
跳過這個‘*’符號;
b>當‘*’匹配1個或多個時,str當前字元移向下一個,pattern當前字元
不變。(這裡匹配1個或多個可以看成一種情況,因為:當匹配一個時,
由於str移到了下一個字元,而pattern字元不變,就回到了上邊的情況a;
當匹配多於一個字元時,相當於從str的下一個字元繼續開始匹配)
之後再寫程式碼就很簡單了。
*/
class Solution { public: bool match(char* str, char* pattern) { if(str==NULL || pattern==NULL) return false; return myMatch(str,pattern); } bool myMatch(char* str,char* pattern){ if(*str=='\0' && *pattern=='\0') return true; if(*str!='\0' && *pattern=='\0') return false; if(*(pattern+1)=='*'){ if(*str==*pattern || (*pattern=='.' && *str!='\0')) //myMatch(str,pattern+2):模式串未匹配 //myMatch(str+1,pattern):模式串已經匹配成功,嘗試匹配下一個字串 return myMatch(str+1,pattern) || myMatch(str,pattern+2); else return myMatch(str,pattern+2); } if(*str==*pattern || (*pattern=='.' && *str!='\0')) return myMatch(str+1,pattern+1); return false; } };