剑指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         //dp[i][j]表示s[0,i-1]和p[0,j-1]能否匹配
 7         dp[0][0]=true;//空串匹配空串
 8         for(int i=1;i<=p_len;++i){
 9             dp[0][i]=i>1 and p[i-1]==‘*‘ and dp[0][i-2];
10         }
11         for(int i=1;i<=s_len;++i){
12             for(int j=1;j<=p_len;++j){
13                 if(p[j-1]==‘*‘){
14                     if(p[j-2]!=‘.‘){//数字+‘*‘
15                         dp[i][j]=dp[i][j-2] or (s[i-1]==p[j-2] and (dp[i-1][j-2] or dp[i-1][j-1]));
16                     }
17                     else{//‘.‘+‘*‘
18                         for(int k=i;k>= 0;--k){
19                             if(dp[k][j-2]){
20                                 dp[i][j]=true;
21                                 break;
22                             }
23                         }
24                     }
25                 }
26                 else if(p[j-1]==‘.‘){
27                     dp[i][j]=dp[i-1][j-1];
28                 }
29                 else{//数字
30                     dp[i][j]=p[j-1]==s[i-1] and dp[i-1][j-1];
31                 }
32             }
33         }
34         return dp.back().back();
35     }
36 };

原文地址:https://www.cnblogs.com/FdWzy/p/12293663.html

时间: 2024-10-11 13:55:56

剑指offer(leetcode 10.) 正则表达式匹配的相关文章

《剑指offer》:[53]正则表达式匹配

题目:请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次).在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配. 分析:常规中,如果是普通的两个字符串,那很简单,我们直接进行对比就可以了,这里又是要求匹配是指字符串的所有字符

剑指offer 52.字符串 正则表达式匹配

题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式.例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 解题思路 解这题需要把题意仔细研究清楚,反正我试了好多次才明白的.   首先,考虑特殊情况:   1&

剑指offer(1~10)题解

剑指offer(1~10) 二维数组中的查找 源代码 class Solution { public: bool Find(int target, vector<vector<int> > array) { for(int i = 0 ; i < array.size() ; i ++){ for( int j = array[i].size() - 1 ; j >= 0 ; j--){ if( array[i][j] == target){ return true;

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

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

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

剑指offer(10)—— 斐波那契数列以及跳台阶问题

总结 2^(n-1)可以用位移操作进行: 1<< (n-1) 如果递归不好思考的话,可以找规律,代码很简单 斐波那契数列(10) 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 public class Solution { public int Fibonacci(int n) { // 先判断n必须在范围内取值 if(n > 39 && n <= 0) return 0; // 为1直接返

剑指offer第10题

import java.util.Scanner; /* 前两种方法是看最低为是不是为1,不为1则向右移动. 第一种只能对正整数有效,对负数不行,因为负数用的是补码,最高外符号位为1,最后右移动,肯定会变成0xFFFFFFFFFF....F*/ public class FindNmuberOf1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNextInt(

剑指offer(10)矩形覆盖

题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题方法: function rectCover(number) { // write code here if(number <= 2){ return number; } //还是斐波那契数列的一个形式转换,用n个小矩形 //第一次放了1*2的小矩形(一块就没有缺口了),剩下的和摆放n-1个小矩形放法相同 //第一次放了2*1的小矩形(放两块才没有缺口

&lt;剑指offer&gt; 第10题

题目:在O(1)时间删除链表节点 给定单向链表的一个头指针和节点指针,定义一个函数在O(1)时间删除该节点 public class Tenth { public class ListNode{ int val; ListNode next; } public static ListNode removeNode(ListNode head, ListNode toBeDeleted){ if(head == null || toBeDeleted == null){ return head;

剑指offer系列——10.矩阵覆盖

Q:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? C:时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M T:@flysall 第一种情况等价于情形1中阴影部分的n-1块矩形有多少种覆盖方法,为f(n-1); 第二种情况等价于情形2中阴影部分的n-2块矩形有多少种覆盖方法,为f(n-2); 故f(n) = f(n-1) + f(n-2),还是一个斐波那契数列.... A: int r