题目:
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
可以说这是目前遇到最难的题目了。
这个题目要我们干什么?答:考虑了 ‘*’和'.'的作用后,两个字符串完全相同。
那么问题来了:如何判断两个字符串相等?方案一:两个字符串的每个字符相等;方案二:两个字符串的字符指针都能移动到最后,指向' '。
可以说,我们大部分的思路都是第一个,然后这道题由于两个特殊字符的出现,使得这种考虑变得很复杂。
其实应该考虑方案二:
我们这样想:假如两个字符串,aaba,aaaa。我们知道这两个字符串不一样,但是我们是如何判断的。我们看到了第一个字符串和第二个字符串第一个不相等的字符出现在字符串中,分别是b ,a。仔细想想,假如,我们首先判断aaba,aaaa;由于a = a;两个字符串变成了aba,aaa;继续,变成了 ba,aa;也就是我们总是在缩小问题的规模,如果第一个字符相等,我们就不再考虑这个字符,将后续的字符串当作新的要判断的字符串,这是什么——分治——如何解决?,递归!!!!
有两篇讲的非常好的博客:
https://blog.csdn.net/weixin_41747893/article/details/104957791
https://blog.csdn.net/weixin_42719927/article/details/89304776
讲的非常清楚!!!
思路:
首先看到这个题我们要考虑到用递归较容易,思路比较清晰。
(大家也可以尝试非递归,说不定我后面会写,用一个二维字符串组来存储结果,可以试一下非递归,我估计有文章会写这个题,也算是对动态规划的练习)
1》》一说 到递归,我们先考虑出口:
(1)字符串str 和模式pattern都走到了最后的‘