zoukankan      html  css  js  c++  java
  • [Leetcode] Regular Expression Matching

    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).
    
    The function prototype should be:
    bool isMatch(const char *s, const char *p)
    
    Some examples:
    isMatch("aa","a") → false
    isMatch("aa","aa") → true
    isMatch("aaa","aa") → false
    isMatch("aa", "a*") → true
    isMatch("aa", ".*") → true
    isMatch("ab", ".*") → true
    isMatch("aab", "c*a*b") → true

    注意:这里的a*表示a可以重复0次或者多次,不是a和*分开的。

     It seems that some readers are confused about why the regex pattern ".*" matches the string"ab"".*" means repeat the preceding element 0 or more times. Here, the "preceding" element is the dot character in the pattern, which can match any characters. Therefore, the regex pattern".*" allows the dot to be repeated any number of times, which matches any string (even an empty string). Think carefully how you would do matching of '*'.Please note that '*' in regular expression is different from wildcard matching, as we match the previous character 0 or more times. But, how many times? If you are stuck,recursion is your friend.

     动态规划,无敌存在

    class Solution {
    public:
        bool isMatch(const char *s, const char *p) {
            int i, j;
            int m = strlen(s);
            int n = strlen(p);
    
            /**
             * b[i + 1][j + 1]: if s[0..i] matches p[0..j]
             * if p[j] != '*'
             * b[i + 1][j + 1] = b[i][j] && s[i] == p[j]
             * if p[j] == '*', denote p[j - 1] with x,
             * then b[i + 1][j + 1] is true iff any of the following is true
             * 1) "x*" repeats 0 time and matches empty: b[i + 1][j -1]
             * 2) "x*" repeats 1 time and matches x: b[i + 1][j]
             * 3) "x*" repeats >= 2 times and matches "x*x": s[i] == x && b[i][j + 1]
             * '.' matches any single character
             */
            bool b[m + 1][n + 1];
            b[0][0] = true;
            for (i = 0; i < m; i++) {
                b[i + 1][0] = false;
            }
            // p[0..j - 2, j - 1, j] matches empty iff p[j] is '*' and p[0..j - 2] matches empty
            for (j = 0; j < n; j++) {
                b[0][j + 1] = j > 0 && '*' == p[j] && b[0][j - 1];
            }
    
            for (i = 0; i < m; i++) {
                for (j = 0; j < n; j++) {
                    if (p[j] != '*') {
                        b[i + 1][j + 1] = b[i][j] && ('.' == p[j] || s[i] == p[j]);
                    } else {
                        b[i + 1][j + 1] = b[i + 1][j - 1] && j > 0 || b[i + 1][j] ||
                                    b[i][j + 1] && j > 0 && ('.' == p[j - 1] || s[i] == p[j - 1]);
                    }
                }
            }
            return b[m][n];
        }
    };
  • 相关阅读:
    LeetCode 1245. Tree Diameter
    LeetCode 1152. Analyze User Website Visit Pattern
    LeetCode 1223. Dice Roll Simulation
    LeetCode 912. Sort an Array
    LeetCode 993. Cousins in Binary Tree
    LeetCode 1047. Remove All Adjacent Duplicates In String
    LeetCode 390. Elimination Game
    LeetCode 1209. Remove All Adjacent Duplicates in String II
    LeetCode 797. All Paths From Source to Target
    LeetCode 1029. Two City Scheduling
  • 原文地址:https://www.cnblogs.com/diegodu/p/4255607.html
Copyright © 2011-2022 走看看