劍指Offer——正則表達式匹配


題目描述:

請實現一個函數用來匹配包括'.'和'*'的正則表達式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配


分析:

當模式中的第二個字符不是“*”時:
1、如果字符串第一個字符和模式中的第一個字符相匹配,那么字符串和模式都后移一個字符,然后匹配剩余的。
2、如果字符串第一個字符和模式中的第一個字符相不匹配,直接返回false。

而當模式中的第二個字符是“*”時:
可以有3種匹配方式:
1、模式后移2字符,相當於x*被忽略;
2、字符串后移1字符,模式后移2字符,x*相當於只匹配一個字符;
3、字符串后移1字符,模式不變,即繼續匹配字符下一位,因為*可以匹配多位;


代碼:

 1 class Solution {
 2 public:
 3     bool match(char* str, char* pattern) {
 4         if(str[0] == '\0' && pattern[0] == '\0') return true;
 5         if(pattern[0] == '\0') return false;
 6         if(str[0] != pattern[0] && pattern[0] != '.' && pattern[1] != '*') return false;
 7         if(pattern[1] != '*') {
 8             if(str[0] == pattern[0] || (str[0] != '\0' && pattern[0] == '.'))
 9                 return match(str + 1, pattern + 1);
10             else return false;
11         } else {
12             bool a, b = false, c = false;
13             a = match(str, pattern + 2);
14             if(a) return true;
15             if(str[0] == pattern[0] || (str[0] != '\0' && pattern[0] == '.')) {
16                 b = match(str + 1, pattern + 2);
17                 c = match(str + 1, pattern);
18             }
19             if(b || c) return true;
20             else return false;
21         }
22     }
23 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM