52、劍指offer--正則表達式匹配
阿新 • • 發佈:2017-06-29
註意 字符 align left 匹配 har match 描述 text 題目描述
請實現一個函數用來匹配包括‘.‘和‘*‘的正則表達式。模式中的字符‘.‘表示任意一個字符,而‘*‘表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配
思路:只有當模式串和字符串同時等於\0,才可以認為兩個串匹配。
如果第二個字符不是*比較簡單,則第一個字符相匹配那麽字符和模式都向後移1,匹配剩下的,否則返回false
在匹配中,如果第二個字符是*比較復雜。對於每個位的匹配可以分為三種情況
1、(相應位匹配||模式串為.&&字符串不是\0)&&模式串下一位是*
2、(相應位匹配||模式串為.&&字符串不是\0)&&模式串下一位不是*
3、相應位不匹配&&(模式位不為.||字符串是\0)對應1,最復雜。
分為*取0,*取1,*>=2三種情況。
*取0對應跳過當前匹配位,繼續尋找patter的下一個匹配位,str不變,pattern+2
*取1對應當前匹配位算一次成功匹配,str+1,pattern+2
*取>=2對應一次成功匹配,繼續匹配字符串的下一位是否匹配,str+1,pattern不變三者取或。
即只要有一種情況能匹配成功認為字符串就是匹配成功的。
對應2,相當於一次成功匹配,str+1,pattern+1
對應3,匹配失敗,直接返回false
1 class Solution { 2 public: 3 bool match(char* str, char* pattern) 4 { 5 if(str == NULL || pattern == NULL) 6 { 7 return false; 8 } 9return matchCore(str,pattern); 10 } 11 bool matchCore(char *str, char *pattern) 12 { 13 if(*str == ‘\0‘ && *pattern == ‘\0‘) 14 return true; 15 if(*str != ‘\0‘ && *pattern == ‘\0‘) 16 return false; 17 if(*(pattern+1) == ‘*‘)//下一位為*(註意優先級問題加()) 18 { 19 if(*pattern == *str || (*pattern == ‘.‘ && *str != ‘\0‘))//當前位匹配 20 { 21 return matchCore(str+1,pattern+2)//匹配一個 22 || matchCore(str+1,pattern)//匹配>=2個 23 || matchCore(str,pattern+2);//匹配0個 24 } 25 else 26 { 27 return matchCore(str,pattern+2);//匹配0個 28 } 29 } 30 if(*str == *pattern ||(*pattern == ‘.‘ && *str !=‘\0‘)) 31 return matchCore(str+1,pattern+1); 32 return false; 33 } 34 };
52、劍指offer--正則表達式匹配