@author stormma
@date 2018/03/24
生命不息,奋斗不止
题目1
Implement wildcard pattern matching with support for '?' and '*'.
'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false
DP思路分析
首先我们选取状态, 用boolean[][] dp
数组来标记s中i个字符串是否匹配于p中j个字符串, 当然如果匹配则为True
, else False
。
下面我们来分析一下状态是怎么变化的。
且看图:
通过上面的状态转移图, 我们很容易可以得到:
1. 边界初始化, 当si = 0;
(即s字符串取0个字符), ps 0 -> p.length()
的初始化为: 如果此时的p[pi]
这个字符是*
的话,
那么它的值应该是上一个的值, 即dp[0][pi] = dp[0][pi - 1]
, 如果此时p[pi] != '*'
呢, 那么肯定是False
. 当pi = 0;
,
初始化dp[si][0] = False && si >= 1
(p中取出0个字符, s中取出任意个(>0), 都是不匹配的), dp[0][0] = True
(此时s中取0个字符和p中取0个字符, 无疑是匹配的).
2. 边界初始化完成之后, 我们分析一下其他地方怎么转移. 分为以下两种情况来讨论:
- if p[pi] == '*'
, 无非是从它的左边和上边转移而来的。
- if p[pi] == '?' || p[pi] == s[si]
, 那么它肯定是从它左上角转移而来。
状态转移分析完成之后, 显然答案便是dp[s.length()][p.length()]
AC代码
/**
* dp解决
* time running time: O(n*m)
* extra space: O(n*m)
*/
sta