zoukankan      html  css  js  c++  java
  • 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 preceding 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 {
    public:
        bool isMatch(string s, string p) {
            int m = s.size();
            int n = p.size();
    
            vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
            //1.dp[0][0] = true;
            dp[0][0] = true;
            //2.dp[i][0] = false // 初始化时已经设置
            //3.dp[0][j] = ? 只有 #*#*#* 或者 (#*)* 这种模式才能匹配空字符串
            for(int j = 0; j < n; j++)
            {
                if ((p[j] == '*') && (dp[0][j-1]))
                    dp[0][j + 1] = true;
            }
            // 1. s[i] == p[j] || p[j] == '.' : dp[i][j] = dp[i - 1][j - 1]
            // 2. p[j] == '*':
            //      (1). s[i] != p[j - 1]:dp[i][j] = dp[i][j - 2] 
            //      (2). s[i] == p[j - 1] || p[j - 1] == '.': dp[i][j] = dp[i][j - 2] || dp[i][j - 1] || dp[i - 1][j]
            //       其中,dp[i][j - 2]为#*匹配0个, dp[i][j - 1]为#*匹配1个,dp[i - 1][j]为#*匹配多个
            for (int i = 0; i < m; ++i)
            {
                for (int j = 0; j < n; ++j)
                {
                    if(p[j] == '.'){
                        dp[i+1][j+1] = dp[i][j];
                    }
                    if(s[i] == p[j]){
                        dp[i+1][j+1] = dp[i][j];
                    }
                    if (p[j] == '*')
                    {
                        if ((s[i] != p[j-1]) && (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]);
                        }
                    }
                }
            }
            return dp[m][n];
        }
    };
  • 相关阅读:
    如何优雅地删除 Linux 中的垃圾文件
    session:
    cookie:
    多对多表结构设计:
    接口测试:
    oracle基本笔记整理
    oracle基本笔记整理
    oracle基本笔记整理
    2016年寒假心得
    2016年寒假心得
  • 原文地址:https://www.cnblogs.com/qiang-wei/p/12284181.html
Copyright © 2011-2022 走看看