zoukankan      html  css  js  c++  java
  • LeetCode(10) 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

    分析

    字符串的模式匹配问题!

    核心的思路是一个动态规划

    dp[i][j]表示字串 s[i…len(s)], p[j…len(p)] 是否可以匹配。

    那么状态转移方程如下:

    dp[i][j] = c. p[j+1] != *.

    if s[i] == p[j]  
        dp[i][j] = dp[i+1][j+1] 
    else 
        dp[i][j] = false

    c p[j+1] == ‘’ (这个情况下,要扩展 , dp[i][j] 从拓展的情况下,选择一个是真的结果)

    if( s[i] ==  p[j] || p[j] == '.' && (*s) != '')  
    当s[i] 和 p[j] 一样的时候,例如 aba, a*b这个时候,i = 0, j = 0, 自然可以匹配a a
    如果p[j] == .  因为他可以匹配任何字符,所以和相等关系有基本一样的方式。

    并且每一步匹配都要递增 i 的值,如果有成立的,则返回true,否则到匹配终了,返回通配符匹配完成后的结果。

    思路参考博客

    AC代码

    class Solution {
    public:
        bool isMatch(string s, string p) {
            //如果字符串为空,那么模式串为空则返回true,否则返回false
            if (p.empty())
                return s.empty();
    
            //求模式串的长度
            int s_len = s.length();
    
            //求字符串的长度
            int p_len = p.length();
    
            if (p[1] == '*')
            {
                while ((s[0] != '' && p[0] == '.') || (s[0] == p[0]))
                {
                    //字符串与模式串匹配0/1/2...个字符的情况 
                    if (isMatch(s, p.substr(2, p_len - 2)))
                        return true;
                    s = s.substr(1, s_len - 1);
                }
                // 字符串与模式串不能匹配  
                return isMatch(s, p.substr(2, p_len - 2));
            }
            else
            {
                if ((s[0] != '' && p[0] == '.') || (s[0] == p[0]))
                    return isMatch(s.substr(1, s_len - 1), p.substr(1, p_len - 1));
                return false;
            }
        }
    };

    GitHub测试程序源码

  • 相关阅读:
    JavaScript Basic Memo
    移动端WEB开发备忘录
    重学前端
    roadhog 构建优化
    ES6 memo
    styled-components 背后的魔法
    怎么在多场景下使用不同的 git 账号 commit
    三方登录总结
    Promise 错误处理
    观察者模式 vs 发布-订阅模式
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214834.html
Copyright © 2011-2022 走看看