劍指offer 16 正則表示式匹配
阿新 • • 發佈:2018-12-20
請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配
解法:注意題目中說的出現0次,例如ab*aa若*代表出現0次的話,則表示為字串aaa。分析題目一共可分為如下情況處理:
- 兩個字串均為空,直接return false;
- str不為空,pattern為空 ,直接return false;
- str為空,pattern不為空 ,考慮是否為aaa a*a*a*的情況 需繼續計算
- 當pattern下一個字元為* :(1)若*代表0個字元 則pattern直接後移兩個字元跳過*(2)若*代表一個或者多個字元 str後移一個字元
- 當pattern下一個字元不為*,直接比對當前字元是否匹配,若不匹配直接return false。匹配的話str與pattern同時後移一個字元。
class Solution { public: bool match(char* str, char* pattern) { if (str == nullptr && pattern == nullptr) return false; return matchcore(str, pattern); } bool matchcore(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')) return matchcore(str + 1, pattern) || matchcore(str, pattern + 2); else return matchcore(str, pattern + 2); //*代表0個該字元 } else { if (*str == *pattern || (*pattern == '.'&&*str != '\0')) return matchcore(str + 1, pattern + 1); else return false; } return false; } };