Description
Given an input string (s
) and a pattern (p
), implement wildcard pattern matching with support for '?'
and '*'
.
1 | '?' Matches any single character. |
The matching should cover the entire input string (not partial).
Note:
s
could be empty and contains only lowercase lettersa-z
.p
could be empty and contains only lowercase lettersa-z
, and characters like?
or*
.
Example 1:
1 | Input: |
Example 2:
1 | Input: |
Example 3:
1 | Input: |
Example 4:
1 | Input: |
Example 5:
1 | Input: |
解法
这道题花的时间挺久,主要是思路难理顺。算法采用的是回溯算法,由题意,?匹配任意一个字符,*匹配任意字符串,我们先考虑采取指针pcur和scur分别指向当前待匹配的字符,那么在匹配过程中,会碰到如下几种情况:
情况1:p[pcur] = s[scur] or p[cur] = ‘?’
匹配成功,pcur和scur分别加一指向下一个字符
情况2:p[pcur] = ‘*‘
这个时候就想着怎么在s中寻找与*配对的字符串,匹配多少个成了需要考虑的问题,那么我们不妨从匹配0个开始尝试,如果匹配0个以后后续字符串出现了无法匹配的情况,则回到星号的位置重新进行匹配,尝试匹配个数比上一次多一个的匹配。为了达到此目的,我们需要添加两个指示量:pstar指向p中*的位置,sstar指向s中下一个*可以匹配的字符位置。
于是情况的划分可变为:
情况1:p[pcur] = s[scur] or p[cur] = ‘?’
匹配成功,pcur和scur分别加一指向下一个字符
情况2:p[pcur] = ‘*‘
记录pstar与sstar的位置,并默认匹配0个字符,所以pcur需要+1而scur保持不变
情况3:以上两种情况都不满足,但是之前有过*号,那么说明按照之前的方法匹配出现了问题,需要重新考虑*号的匹配问题,将*号匹配的字符串长度+1,重新将pcur指向*号后的下一个字符,sstar+1,然后将s中待匹配的下一个字符设为现在的sstar值。
具体代码如下:
1 | class Solution { |