@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)
*/
static

本文总结了字符串匹配问题的解决方案,包括使用动态规划(DP)的思路和AC代码实现。针对不同题目,分析了状态转移图,并探讨了如何处理通配符的情况。文章介绍了两种解法,并通过实例解释了为何在特定情况下需要回溯。
最低0.47元/天 解锁文章
1540

被折叠的 条评论
为什么被折叠?



