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];
        }
    };
  • 相关阅读:
    ORACLE 如何产生一个随机数
    Oracle数据库一些操作信息
    EXP-00091和IMP-00010报错
    ORACLE数据库 memory_target SGA 大小
    linux如何查看端口被哪个进程占用的方法
    命令信息
    Linux负载均衡软件LVS
    oracle 字段信息
    oracle数据库的启动与关闭
    idea解除版本控制
  • 原文地址:https://www.cnblogs.com/diegodu/p/4255607.html
Copyright © 2011-2022 走看看