(力扣每日一题) 通配符匹配

通配符匹配

给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。
‘?’ 可以匹配任何单个字符。
'
’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
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 = “ab”
输出: true
解释: 第一个 ‘’ 可以匹配空字符串, 第二个 '’ 可以匹配字符串 “dce”.

解题思路
动态规划
采用动态规划解决:定义dp[i][j]为s[i]和p[j]是否匹配
则转移方程为:
1、如果p [j] == ’ * ’ ,则dp [ i ] [ j ] = dp[ i-1 ][ j ] | dp [ i ][ j-1 ],代表匹配0个或>=1个
当模式串当前字符为 * 的时候可以匹配任意长度的串(包括0长度)因此主要有下面三种情况:
a、不需要当前的 ‘ * ’ 去匹配
dp[i][j] = dp[i][j-1]
b、需要这个‘ * ’去匹配,而且这个
还需要匹配别的(因为‘ * ’可以匹配串)
dp[i][j] = dp[i-1][j]
c、只需要这个‘ * ’匹配本字符就行了 不需要匹配别的串了
dp[i][j] = dp[i-1][j-1]
2、如果p[ j ] in set( [s[i], ‘?’ ] ),则dp[ i ][ j ] = dp [ i-1 ][ j-1 ],表示i和j相匹配
3、其他情况dp[ i ][ j ] = False
4、最终的答案即为 dp[m][n],其中 m 和 n 分别是字符串 s 和模式 p 的长度。需要注意的是,由于大部分语言中字符串的下标从 0 开始,因此 Si和Pj 分别对应着 s[i−1] 和 p[j−1]。
代码

class

你可能感兴趣的:(常见算法题归纳)