Implement regular expression matching with support for '.'
and '*'
.算法
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
原題地址express
設計一個支持‘.' 和 '*' 的正則表達式匹配算法。微信
這個題複雜的地方在於對於 '*' 的處理。這個符號在正則表達式中被稱爲貪婪型的量詞。這個量詞在實際匹配過程當中也是儘量多的匹配直到詞尾或者不匹配成功才結束。而後假設其後面還有沒有匹配的,則回退到合適的位置。而後才進行下一個匹配。學習
正則表達式中的匹配優先與回溯大概也就是這個意思。關於正則表達式這方面的知識。有興趣可以讀讀《精通正則表達式》的第4章表達式的匹配原理。
回到本題,正因爲 '*'的特殊性。咱們在分類的時候選擇依據 '*' 來進行,分類後其子問題也是一個正則表達式匹配的問題。因此這可以使用遞歸來作。如下來看看代碼,代碼中有凝視說明匹配的類型:
spa
class Solution { public: bool isMatch(const char *s, const char *p) { if(s==NULL || p==NULL) return false; if(*p == '\0') return *s=='\0'; if(*(p+1) != '*'){ if(*p==*s || (*p=='.' && *s!='\0')) return isMatch(s+1, p+1); return false; } else{ //s="aaaabbbb", p="a.*b" while(*p==*s || (*p=='.' && *s!='\0')){ if(isMatch(s, p+2)) return true; ++s; } //s="ab", p="aa*b" return isMatch(s, p+2); } } };
另外,我開通了微信公衆號--分享技術之美,我會不按期的分享一些我學習的東西..net
版權聲明:本文博主原創文章,博客,未經贊成不得轉載。prototype