leetcode 10.正则表达式

题目描述特别简洁:

先贴代码:

class Solution {
    public :
        bool isMatch(string s ,string p){
            int dp[100][100] = {0};
            s.insert(0,1,‘@‘);p.insert(0,1,‘@‘);           //为了将空字符考虑在内,初始化插入@方便之后的操作
            int ls = s.size(),lp = p.size();
            dp[0][0] = 1;                                  //初始化dp(p与s为空字符)
            for(int j = 1 ; j < lp; j++){
                for(int i = 0; i < ls; i ++){
                    if(i != 0 && (s[i] == p[j] || p[j] == ‘.‘) && dp[i-1][j-1] == 1 ){     //直接匹配
                        dp[i][j] = 1;
                    }
                    else if(p[j] == ‘*‘)                                                   //当p[j]为*时情况较为复杂
                    {
                        if(j - 2 >= 0 && dp[i][j - 2] == 1)                                //可以直接把零个随意字符通配Σ*忽略
                        {
                            dp[i][j] = 1;
                        }
                        else if(i !=  0 && (dp[i - 1][j]  == 1 || dp[i - 1][j - 1] == 1) && (s[i] == p[j - 1] || p[j-1] == ‘.‘))       //将Σ*于n个Σ匹配
                        {
                            dp[i][j] = 1;
                        }
                    }
                }
            }
    //        for(int i = 0;i < lp; i++)                        //把dp打印出来用于debug
    //        {
    //            for(int j = 0;j < ls; j++)
    //            {
    //                cout << dp[j][i];
    //            }
    //            cout<<endl;
    //        }
            if(dp[ls - 1][lp - 1])
            {
                cout << "ture";
                return 1;
            }
            else{
                cout << "false";
                return 0;
            }
        }
}; 

通过如下的样例说明状态转移的过程(本题难就难在状态转移的方式比较多样,这也导致用简单的递归方法解题非常困难):

Case #1:

aaa

a*a

(如果将三个a直接用a*通配掉了那就直接得到了一个false)

Solution #1:

ture

DP(dpij) #1:

(当s.substr(0,i)与p.substr(0,j)能够相互匹配时dpij = 1)

1 0 0 0      (空字符串)
0 1 0 0      (dpi-1  j-1 == 1 时 s[i] 与 p[j] 是等价的 就有 dpij = 1)
1 1 1 1      (p[j] == ‘*‘ 且 dpi  j-2 == 1 这表明 考虑dpij的时候 ‘*’ 与它之前的 ‘Σ’ 可以视作 0 个Σ 于是 两个子字符串匹配 dpij = 1) (p[j] == ‘*‘ 且 dpi-1  j == 1 且 s[i] 与 p[j-1]  (也就是Σ)能够匹配 则 dpij = 1)
0 1 1 1      (继续进行上面的状态转移,得到答案)

Case #2:

abp

.*t

Solution #2:

false

(虽然.*匹配任意字符串但是加上个t就不行了)

DP(dpij) #2:

1 0 0 0
0 1 0 0
1 1 1 1
0 0 0 0

Case #3:

bbbopctf

b*.*ctf

(若只想到用.*匹配后面所有的字符便无法匹配“ctf”)

Solution #3:

ture

DP(dpij) #3:

1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0
0 1 1 1 1 0 0 0 0
1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1

动态规划编写简单,优势明显。

原文地址:https://www.cnblogs.com/my-growth/p/12632703.html

时间: 2024-11-10 00:11:14

leetcode 10.正则表达式的相关文章

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

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

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

LeetCode 10 Regular Expression Matching (正则表达式匹配)

翻译 实现支持"."和"*"的正则表达式匹配. "." 匹配支持单个字符 "*" 匹配零个或多个前面的元素 匹配应该覆盖到整个输入的字符串(而不是局部的). 该函数的原型应该是: bool isMatch(const char * s, const char * p) 示例: isMatch("aa","a") → false isMatch("aa","a

[LeetCode]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 (no

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

LeetCode (10): Regular Expression Matching [HARD]

https://leetcode.com/problems/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 ent

LeetCode 10. Regular Expression Matching

https://leetcode.com/problems/regular-expression-matching/description/ Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover

LeetCode(10) - Regular Expression Matching

非常challenge的一道题,考虑的情况特别多,当考虑到了之后,还要考虑怎么处理.题目要求是,给你两个字符串,判断正则字符串能不能表示待检字符串,一个是"aabb",另外一个是正则表达式"a*.*".该正则表达式只有两种特殊符号,一种是'.',代表的是任意字符,另一种是'*',它单独出现没有任何意义,要搭配前一个如"a*",则说明a可以连续出现零到多次,根据这个定义,上面给的例子返回的就是true.总体来说,它要注意的是以下几种情况(s是待检字