zoukankan      html  css  js  c++  java
  • LeetCode 10. Regular Expression Matching

    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
    
    分析:
    
    动态规划,dp[i][j]表示s[0]到s[i]和p[0]到p[j]是否match。这里动态转移方程比较复杂
    
    if (p[j]==’.’||p[j]==s[i])    dp[i+1][j+1]=dp[i][j]
    
    if(p[j]==’*’)
    
         if(p[j-1]!=s[i])    dp[i+1][j+1]=dp[i][j-1]    //in this case, a* only counts as empty
    
         if p.charAt(i-1) == s.charAt(i) or p.charAt(i-1) == ‘.’:
                                     dp[i][j] = dp[i-1][j]          //in this case, a* counts as multiple a 
                                or dp[i][j] = dp[i][j-1]          // in this case, a* counts as single a
                                or dp[i][j] = dp[i][j-2]          // in this case, a* counts as empty
    
    class Solution {
    public:
        bool isMatch(string s, string p) {
            vector<vector<int>> dp(s.size()+1, vector<int> (p.size()+1, 0));
            dp[0][0]=1;
            for(int i=0; i<p.size(); i++)
                if(p[i]=='*'&&dp[0][i-1]==1) 
                    dp[0][i+1]=1;
            for(int i=0; i<s.size(); i++)
                for(int j=0; j<p.size(); j++){
                    if(p[j]=='.')
                        dp[i+1][j+1]=dp[i][j];
                    else if(s[i]==p[j])
                        dp[i+1][j+1]=dp[i][j];
                    else if(p[j]=='*'){
                        if(p[j-1]!= s[i] && p[j-1]!= '.') 
                            dp[i+1][j+1] = dp[i+1][j-1];
                        else
                            dp[i+1][j+1] = (dp[i+1][j] || dp[i][j+1] || dp[i+1][j-1]);
                    }
                }
            if(dp[s.size()][p.size()]==1)
                return true;
            else
                return false;
        }
    };
    
  • 相关阅读:
    《CoderXiaoban》第八次团队作业:Alpha冲刺5
    《CoderXiaoban》第八次团队作业:Alpha冲刺4
    《CoderXiaoban》第八次团队作业:Alpha冲刺 3
    《CoderXiaoban》第八次团队作业:Alpha冲刺 2
    《CoderXiaoban》第八次团队作业:Alpha冲刺1
    毛毛虫组【Beta】Scrum Meeting 3
    毛毛虫组【Beta】Scrum Meeting 2
    毛毛虫组【Beta】Scrum Meeting 1
    《毛毛虫团队》第九次团队作业:BETA冲刺与团队项目验收
    《毛毛虫组》【Alpha】Scrum meeting 5
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/10041136.html
Copyright © 2011-2022 走看看