题目描述:
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
思路分析:
这里要注意审题,一开始看的时候以为是两个模式串的匹配。后来发现一个就是普通的字符串,而另一个才是所谓的模式串,即包含了'.'和'*'。
这类题目需要考虑的比较全面,对各个情况进行分析,并没有太多的技巧点和算法在其中,用到的就是递归。具体的解析在注释当中有进行说明。
思路二:
在刷leetcode时,遇到了类似题目,看一些题解中用到了动态规划的解法,相对于上述思路,代码更简洁。dp数组从往前做匹配,同样去判断当前的模式串是否是带*的形式,若是,dp[i][j]=dp[i][j+2] ||( (p[j] == '.' || p[j] == s[i])&& dp[i+1][j]), 即这个带*模式串为空,或当前所值字符对应相等且前一位也相等。否则dp[i][j] = (p[j] == '.' || p[j] == p[i]) && dp[i+1][j+1],即不带有*时,就需要比较二者的前一位和当前位置的匹配做与操作。
代码:
1 class Solution { 2 public: 3 bool match(char* str, char* pattern) 4 { 5 // 若为空指针,则返回false 6 if(str==nullptr || pattern==nullptr) 7 return false; 8 return matchCore(str, pattern); 9 } 10 11 private: 12 bool matchCore(char* str, char* pattern) 13 { 14 // 若都走到结尾,则返回true 15 if(*str=='