leetcode每日一題(2020-07-05):44. 萬用字元匹配
阿新 • • 發佈:2020-07-05
題目描述:
給定一個字串 (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] };