• 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)
  • 相关阅读:
    NGBOSS转型在即:COTS初露锋芒
    [原]CmsEasy安装,后台“内容管理”页面空白
    CentOS5安装mcrypt问题
    [转]Grub安装修复
    [转]BOSS3接近尾声
    多渠道整合开启NGBOSS第一步
    [原][转]TUXEDO与ORACLE数据库的互连
    [译]Oracle Data Cartridge| Oracle数据筒介绍
    [译]ORACLE数据弹药桶(Data Cartridge)简介
    [原]再说精度用于显示的数字出现精度问题的处理(Perl/Java)
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9727473.html
Copyright © 2020-2023  润新知