字符串匹配问题算法总结

@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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值