1. 程式人生 > 實用技巧 >leetcode每日一題(2020-07-05):44. 萬用字元匹配

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]
};