题目描述
请实现一个函数用来匹配包括 '.' 和 '*' 的正则表达式。模式中的字符'.'表示任意一个字符,而 '*' 表示它前面的字符可以出现任意次(包含0次)。
在本题中,匹配是指字符中的所有字符匹配整个模式。例如,字符串 “aaa” 与模式 “a.a” 和 “ab*ac*a” 匹配,但是与“aa.a”和“ab*a”均不匹配。
解题思路
应该注意到,'.' 是用来做一个任意字符,而 '*' 是用来重复前面的字符。 这两个的作用不同,不能把 '.' 的作用和 '*' 进行类比,从而把它当成重复前面字符一次。
1.分析题目
- 输入:一个待匹配字符串,一个待匹配正则表达式
- 输出:字符串与正则表示式相匹配则输出
true
,否则输出false
- 条件:正则表达式中仅含两个特殊字符;
.
表示任意一个字符,*
表示它前面的字符能够出现0~无数次。题目未说明是否贪心匹配(即尽可能多的匹配)的情况下,应默认非贪心匹配。即应考虑类似aaa
与a*aa
相匹配的情况。同时注意可能会出现.*
这类能够匹配所有字符的表达式。
2.可能出现的情况
考虑字符串和正则相匹配时能够相消去,则当最终两者为空时为匹配成功;中途有不匹配且不带*的字符或是最终不能相互消去时为匹配失败。这种情况很显然使用指针移动特别好用。
考虑情况如下:
- 字符串空时,正则式不为空。后者剩余字符若皆为带/*字符,则应继续消去。
- 当前指针指向字符能够消去时(正则式当前指针字符与字符串当前指针字符相同,或是正则式当前指针字符为
.
且字符当前指针不为