zoukankan      html  css  js  c++  java
  • 【LeetCode 10】正则表达式匹配

    题目链接

    【题解】

    看到这个[题解](https://leetcode-cn.com/problems/regular-expression-matching/solution/ji-yu-guan-fang-ti-jie-gen-xiang-xi-de-jiang-jie-b/) 写的代码。 就是加个备忘录法。优化一下暴力的做法。 匹配的时候如果遇到*号的话,就两种可能。不再考虑它前面一个字符了。 跳过这个*或者。或者继续用*前面那个字符匹配。 即dfs(i,j+2) 不和他匹配了 && (i和j能匹配且j+1是个*则继续复制一个和其匹配,dfs(i+1,j)) 当然,还得尝试一下不用*通配符了(s1[i]==s2[j])然后直接看看dfs(i+1,j+2)能不能匹配

    【代码】

    class Solution {
    public:
        map<pair<int,int>,bool> dic;
        int len1,len2;
        
        bool ok(string &s1,string &s2,int i,int j){
            if (dic.find(make_pair(i,j))!=dic.end()) return dic[make_pair(i,j)];
            //cout<<"**"<<i<<" "<<j<<endl;
            if (i==len1){
                if (j==len2){
                    return true;
                }
                //j!=len2不代表一定不能匹配。可能后面有*号
            }
            if (j==len2) return false;
            bool firstmatch = false;
            if (i<len1 && (s1[i]==s2[j] || s2[j]=='.')) firstmatch=true;
    
            //能够匹配到
                    //cout<<i<<" "<<j<<" "<<firstmatch<<endl;
            if (firstmatch && ok(s1,s2,i+1,s2[j+1]=='*'?j+2:j+1)) return true; //j+1是通配符的话,要跳过它。
            if (j+1==len2 || s2[j+1]!='*') return false;
            //j+1<len2 && s2[j+1]=='*'
    
            bool ju = ok(s1,s2,i,j+2) || (firstmatch && ok(s1,s2,i+1,j));
            dic[make_pair(i,j)] = ju;
            return ju;
        }
        
        bool isMatch(string s, string p) {
            dic.clear();
            len1 = s.size();len2 = p.size();
            return ok(s,p,0,0);
        }
    };
    
  • 相关阅读:
    【jquery ,ajax,php】加载更多实例
    关于scrollTop
    jquery 底部导航透明度变化
    jquery 处理密码输入框(input type="password" ) 模仿placeholder
    物化视图基于rowID快速刷新
    ora-01653 无法通过1024扩展
    oracle临时表空间
    java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer
    redis 简单使用
    BigDecimal 运算
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11797115.html
Copyright © 2011-2022 走看看