劍指offer——正則表示式匹配(遞迴呼叫)
阿新 • • 發佈:2018-11-09
當模式中的第二個字元不是“*”時:
1、如果字串第一個字元和模式中的第一個字元相匹配,那麼字串和模式都後移一個字元,然後匹配剩餘的。
2、如果 字串第一個字元和模式中的第一個字元相不匹配,直接返回false。
而當模式中的第二個字元是“*”時:
如果字串第一個字元跟模式第一個字元不匹配,則模式後移2個字元,繼續匹配。如果字串第一個字元跟模式第一個字元匹配,可以有3種匹配方式:
1、模式後移2字元,相當於x*被忽略;
2、字串後移1字元,模式後移2字元;
3、字串後移1字元,模式不變,即繼續匹配字元下一位,因為*可以匹配多位;
class Solution { public: bool match(char* str, char* pattern) { if (*str == '\0' && *pattern == '\0')return true; if (*pattern == '\0')return false; //模式串下一個字元不是'*' if(*(pattern + 1) != '*') { //檢視當前位置是否匹配 if(*str == *pattern || (*str != '\0' && *pattern == '.')) return match(str + 1, pattern + 1);//匹配的話進行下一個字元比較 else return false;//不匹配則返回錯誤 }else//模式串下一個字元是'*' { //檢視當前位置是否匹配 if (*str == *pattern || (*str != '\0' && *pattern == '.')) //1、匹配一個 2、不想匹配 3、 可能可以匹配多個,僅字串走一步即可 return match(str + 1, pattern + 2) || match(str, pattern + 2) || match(str + 1, pattern); else return match(str, pattern + 2);//不匹配,模式串走兩步 } } };