难度困难336收藏分享切换为英文关注反馈
给定一个字符串 (s
) 和一个字符模式 (p
) ,实现一个支持 '?'
和 '*'
的通配符匹配。
'?' 可以匹配任何单个字符。 '*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符?
和*
。
示例 1:
输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入: s = "aa" p = "*" 输出: true 解释: '*' 可以匹配任意字符串。
示例 3:
输入: s = "cb" p = "?a" 输出: false 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。
示例 4:
输入: s = "adceb" p = "*a*b" 输出: true 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".
示例 5:
输入: s = "acdcb" p = "a*c?b" 输入: false
递归解释还不是很了解,那就强行写博客
首先,在字符串匹配过程是分为这几种情况的,首先:如果只是a-z的话,判断是不是相等,不相等就是false没得商量。
那好如果是*呢?那么x*号可能匹配很多字符串,也可能一个字符串也不匹配。所以在动态规划过程(dp[p][s]:代表p位置和s位置的匹配结果)那如果是*号除了前面s和p匹配过的位置之外,都是可以和*号匹配的。
所以就有
while (s1<s.length()+1) dp[p1][s1++]=true;
那么
while ((!dp[p1-1][s1-1]) && s1<s.length()+1) s1++;是什么意思呢
我自己的理解是:找s位置还没有匹配的开始和*匹配。那
dp[p1][s1-1]=dp[p1-1][s1-1];是啥意思呢
其实动态规划是状态继承的过程:所以我这里*号的这个位置的状态比如和前面一样,要是我*号不匹配了呢,那*号后面的在字符状态要从哪里继承呢?
后面的就理解了,就不写了,不难。