题目描述
请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

这道题目和我想象中的一样 有很多异常的边界条件需要考虑,是非常折磨人的,写这道题目最好能用测试驱动开发的思路来进行题目的求解。

s1和s2进行比较,那要按照什么样的思路来进行这道题目的求解呢,如果能有固定的求解思路,那么一定是这个思路在一定单位内是可重复使用的才是一个真正的思路。s1中不包含特殊的字符,s2中会包含一般字符以及特殊字符。
.是一个替代的作用,代表任何一个字符
*是一个ctr-v的操作 代表它前面的字符可以出现任一次,包含0次。那么这个时候取决于前面的字符是什么,要充分理解*的作用是解决这道题目的关键。a*可以代表的意思有:空字符串、a、aa、aaa,.*可以代表的意思有:空字符串、., .., ...,。在做字符串的题目是首先判断的是字符串是否为空。
(1)s1为空字符串,s2为空字符串,那么两者应该是相等的,返回true。
(2)s1为非空字符串,s2为空字符串,那么两者应该不等,返回false
(3)s1为空字符串,s2为非空字符串,两者有可能相等,s1为空串的情况下,如果s2为:a*a*,.*.*,a**.**,以及*都是是完全合乎要求的。
(4)然后我们重点要研究:s1为非空字符串,s2为非空字符串的时候。这是时候我们要充分利用递归的思想来解决这道题目。
(4-1)如果s2待匹配长度为1 或者 s2的第二个字符不是*,那么我们可以充分通过s1第一个字符与s2第一个字符的比较结果作为整个字符串的匹配结果进行返回,如果相等或s2的第一个字符为'.'的那么应该返回true,否则返回false。
(4-2)如果s2的第二个字符是*,那么这个*和前一个字符X组成的可能情况为:空字符串、X、XX...,对于这三种情况应该需要做不同的处理,
(4-2-1)空字符串好理解(可能不需要匹配这个,如a和a*a的匹配,也可能s1和s2的第一个字符串不相等所以需要跳过,如a,b*a的匹配)
(4-2-2)匹配一个X以及多个XX的前提是,s1和s2的第一个字符串相等或者s2的第一个字符串为'.'。基于以上,其实(4-2)中的分析是基于我们并不知道我们到底需要重复多少次X,因此我们做了这几种分析来寻找尽可能正确的答案。

public class Solution {
    public boolean help(char[]