Question Link:
https://leetcode.com/problems/regular-expression-matching/
Dynamic Programming
Let M[i][j] denote if string s[0..i-1] matches pattern p[0..j-1]. Then we have the recursive function of M:
- If 
p[j-1]is a character other than*or.:M[i][j] = p[j-1] == s[j-1] and M[i-1][j-1] - If 
p[j-1]is.:M[i][j] = M[i-1][j-1] - If 
p[j-1]is*, there are three different cases on howp[j-2, j-1]matchess.p[j-2,j-1]matches 0 element, thenM[i][j] = M[i][j-2]p[j-2,j-1]matches 1 element, thenM[i][j] = M[i][j-1](remove*)p[j-2,j-1]matches multiple elements, thenp[j-1]should be.ors[i-1], alsoM[i-1][j]is true (remove last character froms)
 
Python implementation
The python code is as follows.
[-]
Python code accepted by LeetCode OJ
class Solution(object):
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        DP solution:
        M[i][j] denotes if s[0,..,i-1] matches p[0,..,j-1]
        Then the recurisve function of M[i][j] is:
        1. If p[j-1] is a character other than "*" and ".":
            M[i][j] = M[i-1][j-1] && s[i-1] == p[j-1]
        2. If p[j-1] is ".":
            M[i][j] = M[i-1][j-1]
        3. If p[j-1] is "*":
            1) If "*" matches 0 p[j-2]:
                M[i][j] = M[i][j-2]
            2) If "*" matches 1 p[j-2]:
                M[i][j] = M[i][j-1]
            3) If "*" matches multiple p[j-2], M[i][j] is true iff:
                a. s[i-1] == p[j-2] or p[j-2] is ".", and
                b. M[i-1][j] is true
        """
        n = len(s)
        m = len(p)
        # Initialize the 2D array
        M = [[False for x in range(m+1)] for y in range(n+1)]
        M[0][0] = True
        # Initialize M[0][j] for j = 2,...,m
        for j in xrange(2, m+1):
            if p[j-1] == "*":
                M[0][j] = M[0][j-2]
        for i in xrange(1, n+1):
            for j in xrange(1, m+1):
                if p[j-1] == ".":
                    M[i][j] = M[i-1][j-1]
                elif p[j-1] == "*":
                    if M[i][j-2] or M[i][j-1] or ( (p[j-2] == "." or p[j-2] == s[i-1]) and M[i-1][j] ):
                        M[i][j] = True
                else:
                    M[i][j] = M[i-1][j-1] and p[j-1] == s[i-1]
        return M[n][m]
Character-by-character Matching
There is a character-by-character matching here.