1. 程式人生 > >52、劍指offer--正則表達式匹配

52、劍指offer--正則表達式匹配

註意 字符 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         }
 9
return 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--正則表達式匹配