leetcode每日一题(2020-07-05):44. 通配符匹配
Posted autumn-starrysky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode每日一题(2020-07-05):44. 通配符匹配相关的知识,希望对你有一定的参考价值。
题目描述:
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 ‘?‘ 和 ‘*‘ 的通配符匹配。
‘?‘ 可以匹配任何单个字符。
‘*‘ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
今日学习:
1.动规,这次就差一点就做出来了
题解:
1.我考虑问题的时候有一块想简单了【初始化dp[0][j]】,有一块想复杂了【?和相等的时候直接等于左上角就可以,不需要知道前面是什么】
2.看注释吧
var isMatch = function(s, p) {
let dp = new Array(s.length + 1)
for(let i = 0; i < dp.length; i++) {
dp[i] = new Array(p.length + 1).fill(false)
}
//p和s都为空时可以匹配
dp[0][0] = true
//若p中只有*,则可以任意匹配s
if(p[0] == ‘*‘) {
for(let i = 0; i <= s.length; i++) {
dp[i][1] = true
}
}
//这里没初始化dp[0][j]
for(let i = 0; i < s.length; i++) {
for(let j = 0; j < p.length; j++) {
//这里想复杂了
if(p[j] == ‘?‘ || p[j] == s[i]) {
if(p[j - 1] == ‘*‘) {
dp[i + 1][j + 1] = dp[i + 1][j]
}else {
dp[i + 1][j + 1] = dp[i][j]
}
}
if(p[j] == "*") {
//这里少考虑了一种情况
if(dp[i][j + 1] == true) {
dp[i + 1][j + 1] = true
}else {
dp[i + 1][j + 1] = dp[i + 1][j]
}
}
}
}
return dp[s.length][p.length]
};
var isMatch = function(s, p) {
let sLen = s.length, pLen = p.length
let dp = new Array(sLen + 1)
for(let i = 0; i <= sLen; i++) {
dp[i] = new Array(pLen + 1).fill(false)
}
// p和s都为空时可以匹配成功
dp[0][0] = true
// 若p中只有*,则可以任意匹配的s
if(p[0] == ‘*‘) {
for(let i = 0; i <= sLen; i++) {
dp[i][1] = true
}
}
// 初始化dp第0行,即s为空字符串的情况
// 只有连续的‘*‘才能匹配空字符串
for(let j = 1; j <= pLen; j++) {
dp[0][j] = p[j - 1] == ‘*‘ && dp[0][j - 1]
}
for(let i = 0; i < sLen; i++) {
for(let j = 0; j < pLen; j++) {
// ‘?‘和相同的字符串地位相等
if(p[j] == ‘?‘ || p[j] == s[i]) {
dp[i + 1][j + 1] = dp[i][j]
}
// *可以匹配任意新字符,也可以当作空字符使用
if(p[j] == "*") {
if(dp[i][j + 1] == true || dp[i + 1][j] == true) {
dp[i + 1][j + 1] = true
}
}
}
}
return dp[sLen][pLen]
};
以上是关于leetcode每日一题(2020-07-05):44. 通配符匹配的主要内容,如果未能解决你的问题,请参考以下文章