题目描述:
Given an input string (s
) and a pattern (p
), implement regular expression matching with support for '.'
and '*'
.
1 | '.' Matches any single character. |
The matching should cover the entire input string (not partial).
样例:
1 | Input: |
1 | Input: |
1 | Input: |
1 | Input: |
1 | Input: |
题意:
给出一个字符串 s
和一个匹配串 p
,并且匹配串中会有.
和*
,其中.
和*
分别代表:
1 | '.' 匹配任何单个字符。 |
思路:
蚊子的思路就是先将简单的情况列举出来进行判断,然后再将复杂的情况分割成简单的情况,然后逐一递归破解。
- 若
p
为空,且s
也为空,返回 true,反之返回 false。 - 若
p
的长度为 1,且s
长度也为 1,且相同或者p
为 ‘.’ 则返回 true,反之返回 false。 - 若
p
的第二个字符不为 ‘*’,若此时s
为空,返回 false,否则判断首字符是否匹配,然后调用各自的第二个字符进行递归判断。 - 若
p
的第二个字符为 ‘*’,进行下列循环,若s
不为空,且首字母匹配,调用递归函数判断s
和去掉前两个字符的串p
(这样做的原因是假设此时的型号的作用是让前面的字符出现 0 次,验证是否匹配)若匹配,返回 true,否则s
去掉首字母(因为此时首字母匹配了,我们可以去掉s
的首字母,而p
由于星号的作用,可以有任意个首字母,所以不需要去掉),然后继续循环。 - 最后一种是处理 ‘*‘ 无法匹配的情况(比如 s = “ab”,p = “a*b”,直接进入第四种情况后,我们会发现 “ab” 和 “b” 不匹配,所以
s
变成 “b”,那么此时跳出循环后,就到最后的比较 “b” 和 “b” 了,最后返回 true)
最后蚊子的代码是这样的:
1 | class Solution { |
Rumtime:200ms Memory:14.5MB
然后发现讨论区的同伴们真的强,这代码也太简洁了叭,tql
1 | class Solution { |
Rumtime:224ms Memory:18.1MB