leetcode解題報告:44 Wildcard Matching

問題描述:

給定字符串s與模式串p,其中p中的'?'可以匹配任意單個字符,'*'可以匹配任意字符串(包括空串),判斷模式串是否匹配字符s全部(不是部分)。


例子:

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


思路:動態規劃

  • 字符串s: s1s2...sm 模式串p: p1p2...pn

  • 遞歸子問題:如果sm與pn相同或者pn是'?',那麼問題歸爲判斷s1s2...sm-1與p1p2...pn-1是否匹配。如果pn爲'*',如果'*'匹配空串,那麼問題歸爲判斷s1s2...sm與p1p2...pn-1是否匹配,如果'*'不匹配空串,那麼問題歸爲s1s2...sm-1與p1p2...pn是否匹配子問題。

  • 終止條件:當字符串s爲空時,如果p爲空或者p中都是'*'返回真,否則返回假。


代碼:Python

class Solution:
    # @param s, an input string
    # @param p, a pattern string
    # @return a boolean
    def __init__(self):
        self.mark2D = []
        
    def isMatch(self, s, p):
        self.mark2D = [[-1 for i in range(1024)] for j in range(1024)]
        self.isMatch1(s, p)
        
    def isMatch1(self, s, p):
        if self.mark2D[len(s)][len(p)] != -1:
            return self.mark2D[len(s)][len(p)]
        ret = False
        if len(s) == 0:
            if len(p) == 0 or (p[0] == '*' and len(set(p)) == 1):
                ret = True
            else:
                ret = False
        elif len(p) == 0:
            ret = False
        elif s[-1] == p[-1] or p[-1] == '?':
            ret = self.isMatch1(s[0:-1], p[0:-1])
        elif p[-1] == '*':
            if self.isMatch1(s, p[0:-1]):
                ret = True
            else:
                ret = self.isMatch1(s[0:-1], p)
        else:
            ret = False
        self.mark2D[len(s)][len(p)] = ret
        return ret;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章