'''

思路:
    生成二维数组,动态规划
'''

class Solution(object):
    def isMatch(self, s, p):
        slen = len(s)
        plen = len(p)
        arr = [([False]*(slen+1))for _ in range(plen+1)]
        arr[0][0] = True
        for i in range(1,plen+1):
            if i >= 2 and p[i-1] == '*' and arr[i-2][0]:
                arr[i][0] = True
        for i in range(1,plen+1):
            for j in range(1,slen+1):
                if p[i-1] == '*':
                    if p[i-2] == '.':
                        if arr[i-1][j-1] or arr[i][j-1] or arr[i-1][j]:
                            arr[i][j] = True
                        if i >= 2 and arr[i-2][j]:
                            arr[i][j] = True
                    else:
                        if p[i-2] == s[j-1] and (arr[i-1][j] or arr[i][j-1] or arr[i-2][j]):
                            arr[i][j] = True
                        if i>=2 and p[i-2] != s[j-1] and arr[i-2][j]:
                            arr[i][j] = True
                else:
                    if (p[i-1] == s[j-1] or p[i-1] == '.') and arr[i-1][j-1]:
                        arr[i][j] = True
        return arr[plen][slen]

本题是动态规划第一题,通过画出二维数组解决问题。