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 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

    AC code:

    class Solution {
    public:
        bool isMatch(string s, string p) {
            int len1 = s.length(), len2 = p.length();
            // 初始化
            vector<vector<bool> > dp(len1+1, vector<bool>(len2+1, false));
            dp[0][0] = true;
            // "a"
            // "aa*"   --->  "a"
            for (int i = 1; i <= len2; ++i) {
                if (p[i-1] == '*' && dp[0][i-2])
                    dp[0][i] = true;
            }
            // DP
            for (int i = 1; i <= len1; ++i) {
                for (int j = 1; j <= len2; ++j) {
                    if (s[i-1] == p[j-1] || p[j-1] == '.') {
                        dp[i][j] = dp[i-1][j-1];
                    } else if (p[j-1] == '*') {
                        if (p[j-2] != '.' && p[j-2] != s[i-1])
                            dp[i][j] = dp[i][j-2];                                     
                        else {
                            dp[i][j] = (dp[i][j-2] || dp[i-1][j] || dp[i][j-1]);
                        }
                    }
                }
            }
            return dp[len1][len2];
        }
    }; 
    

      

    Runtime: 12 ms, faster than 51.36% of C++ online submissions for Regular Expression Matching.
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    linux(cat,more,less,head)——对文件显示进行查看操作
    linux(ln)
    Linux(touch)
    Linux(cp)
    Linux(rmdir,rm,mv)
    Linux(mkdir)
    一个对象是否能够引用该类其他实例的私有成员?
    圆角图标
    android.content.ReceiverCallNotAllowedException问题解决
    list view item高度设置
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9727473.html
Copyright © 2011-2022 走看看