leetcode新年病房暴乱康复计划 10.正则表达式匹配 DP

/**
 * @param {string} s
 * @param {string} p
 * @return {boolean}
 */
var isMatch = function(s, p) {
    let dp = [];
    let len = s.length;
    let _len = p.length;
    for(let i = 0; i <= len; i++){
        dp.push([]);
        dp[i][0] = 0;
    }
    dp[0][0] = 1;
    for(let i = 0; i <= _len; i++){
        if(p.charAt(i) === ‘*‘ && dp[0][i - 1]){
            dp[0][i + 1] = 1;
        }else{
            dp[0][i + 1] = 0;
        }
    }
    for(let i = 0; i < len; i++){
        for(let j = 0; j < _len; j++){
            if((s.charAt(i) === p.charAt(j) || p.charAt(j) === ‘.‘) && dp[i][j]){
                dp[i + 1][j + 1] = 1;
            }else if(p.charAt(j) === ‘*‘ && (dp[i + 1][j] || dp[i][j + 1]) && (s.charAt(i) === p.charAt(j - 1) || p.charAt(j - 1) === ‘.‘)){
                dp[i + 1][j + 1] = 1;
            }else if(p.charAt(j) === ‘*‘ && dp[i + 1][j - 1]){
                dp[i + 1][j + 1] = 1;
            }else{
                dp[i + 1][j + 1] = 0;
            }
        }
    }
    return dp[len][_len];
};

如果 p.charAt(j) == s.charAt(i) : dp[i][j] = dp[i-1][j-1];
如果 p.charAt(j) == ‘.‘ : dp[i][j] = dp[i-1][j-1];
如果 p.charAt(j) == ‘*‘:
  如果 p.charAt(j-1) != s.charAt(i) : dp[i][j] = dp[i][j-2] //in this case, a* only counts as empty
  如果 p.charAt(i-1) == s.charAt(i) or p.charAt(i-1) == ‘.‘:
    dp[i][j] = dp[i-1][j] //in this case, a* counts as multiple a
    or dp[i][j] = dp[i][j-1] // in this case, a* counts as single a
    or dp[i][j] = dp[i][j-2] // in this case, a* counts as empty

来自乔碧萝殿下?的题解

原文地址:https://www.cnblogs.com/qq965921539/p/12283924.html

时间: 2024-10-05 08:40:53

leetcode新年病房暴乱康复计划 10.正则表达式匹配 DP的相关文章

leetcode新年病房暴乱康复计划 15. 三数之和 JS解法

var threeSum = function(nums) { var ans = []; var nums = nums.sort(function(a,b){return a - b}); var flag = 0; while(flag < nums.length - 2){ if (nums[flag] > 0){ break; } var l = flag + 1,r= nums.length - 1; while(l < r){ var res = nums[flag] +

LeetCode(10. 正则表达式匹配)

问题描述 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ,而不是部分字符串. 说明: s 可能为空,且只包含从 a-z 的小写字母. p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *. 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配

10. 正则表达式匹配

/*给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串. 说明 : s 可能为空,且只包含从 a - z 的小写字母. p 可能为空,且只包含从 a - z 的小写字母,以及字符 .和 *. 示例 1 : 输入 : s = "aa" p = "a" 输出 : false 解释 : "a&

WC2017游记 &amp; 能力残废康复计划

懒癌晚期的蒟蒻一年多没有更Blog了- 这次冬眠营去绍一省好好地游玩了一番,体验了一段时间的豪华自助餐,成功吃胖- 第一课堂的东西基本还是没吸收-听着觉得有点道理,结果过几分钟就忘了-可能最大的收获就是(又)体会到自己太弱了- 于是变成了吃饭冬眠旅游营- 顺便-松爷真是太强辣-(我多年卡常可能卡的是假常数-排序连一亿都跑不过-丢人-) 于是三题都拿了小暴力分-虚炸了-凭借手玩提答的一分刚好卡过线一分(看起来还是挺多人刚好80的) 然后就旅游到杭州学车大酒店某校区,摸了几天鱼之后就回来了- 最虚的

dp乱写1:环形区间dp(数字游戏)

状态: fmax[i,j]//表示前i个数分成j个部分的最大值 fmin[i,j]//表示前i个数分成j个部分的最小值 边界:fmax[i,1]:=(sum[i] mod 10+10) mod 10(sum[i]为前i个数的总和);fmin[i,1]:=(sum[i] mod 10+10) mod 10; 状态转移方程: fmax[i,j]:=max(fmax[i,j],fmax[k,j-1]*ff(sum[i]-sum[k])); fmin[i,j]:=min(fmin[i,j],fmin[k

android 先10位匹配,若是无法匹配,则换成7位匹配

若是一些海外需求,对于号码匹配位数,需要先10位匹配,若是无法匹配,则换成7位匹配 具体情况举例: Case 1: 如果您保存的有:A:04165191666, B:5191666,  来电号码是:04165191666 因为是7位匹配,所以A和B都可以匹配到,但是最佳匹配还是A,最后显示A: 来电5191666则匹配到B. Case 2: 仅保存 A:04165191666, 来电5191666或者04165191666则都匹配A. Case 3: 仅保存 B:5191666, 来电51916

Leetcode 10 regular expression matching (正则表达式匹配) (动态规划)

Leetcode 10 问题描述 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 entir

剑指offer(leetcode 10.) 正则表达式匹配

这题一年前就做过,当时刚开始刷leetcode,提交了几十次过不去,就放那没管了.今天剑指offer又遇到这题,终于做出来了,用的dp. 1 class Solution { 2 public: 3 bool isMatch(string s, string p) { 4 int s_len=s.size(),p_len=p.size(); 5 vector<vector<bool>> dp(s_len+1,vector<bool>(p_len+1,false)); 6

康复计划#4 快速构造支配树的Lengauer-Tarjan算法

本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡到$O(m \log n)$上界的办法作为小彩蛋- 1.基本介绍 支配树 DominatorTree 对于一个流程图(单源有向图)上的每个点$w$,都存在点$d$满足去掉$d$之后起点无法到达$w$,我们称作$d$支配$w$,$d$是$w$的一个支配点. 支配$w$的点可以有多个,但是至少会有一个.