美文网首页
10. Regular Expression Matching

10. Regular Expression Matching

作者: 醉乡梦浮生 | 来源:发表于2018-05-31 18:34 被阅读0次

    地址:https://leetcode.com/problems/regular-expression-matching/description/

    描述:

    Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'.

    '.' Matches any single character.
    '*' Matches zero or more of the preceding element.

    The matching should cover the entire input string (not partial).

    Note:

    • s could be empty and contains only lowercase letters a-z.
    • p could be empty and contains only lowercase letters a-z, and characters like . or *.

    Example 1:

    Input:
    s = "aa"
    p = "a"
    Output: false
    Explanation: "a" does not match the entire string "aa".

    Example 2:

    Input:
    s = "aa"
    p = "a*"
    Output: true
    Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

    Example 3:

    Input:
    s = "ab"
    p = ".*"
    Output: true
    Explanation: "." means "zero or more () of any character (.)".

    Example 4:

    Input:
    s = "aab"
    p = "c*a*b"
    Output: true
    Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".

    Example 5:

    Input:
    s = "mississippi"
    p = "mis*is*p*."
    Output: false

    递归

    class Solution(object):
        def isMatch(self, s, p):
            """
            :type s: str
            :type p: str
            :rtype: bool
            """
            #递归
            if len(p)==0:
                return len(s)==0
            if (len(p)==1) or (p[1]!='*'):
                if len(s)==0 or (s[0]!=p[0] and p[0]!='.'):
                    return False
                return self.isMatch(s[1:], p[1:])
            else:
                i = -1
                length = len(s)
                while i<length and (i<0 or p[0]=='.' or p[0]==s[i]):
                    if self.isMatch(s[i+1:], p[2:]):
                        return True
                    i += 1
                return False
    

    动态规划

    class Solution(object):
        def isMatch(self, s, p):
            """
            :type s: str
            :type p: str
            :rtype: bool
            """
            #动态规划
            dp = [[False for i in range(len(p)+1)] for j in range(len(s)+1)]
            dp[0][0] = True
            for i in range(1, len(p)+1):
                if p[i-1]=='*':
                    if i>=2:
                        dp[0][i]=dp[0][i-2]
            for i in range(1,len(s)+1):
                for j in range(1,len(p)+1):
                    if p[j-1]=='.':
                        dp[i][j]=dp[i-1][j-1]
                    elif p[j-1]=='*':
                        dp[i][j]=dp[i][j-1] or dp[i][j-2] or (dp[i-1][j] and (s[i-1] == p[j-2] or p[j-2] == '.'))
                    else:
                        dp[i][j]=dp[i-1][j-1] and s[i-1]==p[j-1]
            return dp[len(s)][len(p)]
    

    相关文章

      网友评论

          本文标题:10. Regular Expression Matching

          本文链接:https://www.haomeiwen.com/subject/taccsftx.html