LeetCode 44 [Wildcard Matching]

原題

判斷兩個(gè)可能包含通配符“?”和“*”的字符串是否匹配。匹配規(guī)則如下:

'?' 可以匹配任何單個(gè)字符。
'*' 可以匹配任意字符串(包括空字符串)。

兩個(gè)串完全匹配才算匹配成功。

函數(shù)接口如下:
bool isMatch(const char *s, const char *p)

一些例子:

isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false

解題思路

  • 動(dòng)態(tài)規(guī)劃,內(nèi)存需要優(yōu)化,滾動(dòng)數(shù)組, 10000 * 10000 轉(zhuǎn)化成 2 * 10000
  • 狀態(tài)cache[i][j]表示S的前i和T的前j是否match
  • 狀態(tài)轉(zhuǎn)移
  • 如果PD[i-1][j]==true或者PD[i][j-1]==true,并且s[i]=='*'或者p[j]=='*'時(shí)PD[i][j]==true;
  • 如果PD[i-1][j-1]==true時(shí),s[i]與p[j]匹配,則PD[i][j]==true。
  • 換句話(huà)說(shuō),一個(gè)格子的True或者False只與左側(cè),左上和上方的格子有關(guān),如下圖
Screenshot at Jun 05 04-37-09.png

完整代碼

class Solution(object):
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        if len(p) - p.count('*') > len(s):   #avoid TLE(Time Limited Exceeded)
            return False
        cache = [[False for i in range(len(s) + 1)] for j in range(2)]
        cache[0][0] = True
        for j in range(1, len(p) + 1):
            cache[j % 2][0] = cache[(j - 1) % 2][0] and p[j - 1] == "*"
            for i in range(1, len(s) + 1):
                cache[j % 2][i] = False
                if s[i - 1] == p[j - 1] or s[i - 1] == "?" or p[j - 1] == "?":
                    cache[j % 2][i] = cache[(j - 1) % 2][i - 1]
                if s[i - 1] == "*" or p[j - 1] == "*":
                    cache[j % 2][i] = cache[(j - 1) % 2][i] or cache[j % 2][i - 1]
        return cache[len(p) % 2][len(s)]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容