LeetCode Regular Expression Matching

原题链接在这里: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 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

题解:

recursion, 这里注意 '*'是表示0或者多个 p're'ceding 那么 '*' 不可能出现在首位。

终止条件两个,一个是pattern长度为0,那么string的长度同时为0返回true. 另一个是pattern长度为1,那么string 首字符相同 || pattern字符是'.'

接下来就是分析pattern长度为2及以上,首先看pattern第二个字符是否为'*', 不是的话 string 和 pattern 同时一个一个减少。

若是'*', 它可能代表0个前置字符, 或者多个. 0个时直接去掉就好, 多个时移动s的指针.

Time Complexity: Exponential. Space: O(n). n 是string 长度.

AC Java:

 1 public class Solution {
 2     public boolean isMatch(String s, String p) {
 3         //pattern 长度为0
 4         if(p.length() == 0){
 5             return s.length() == 0;
 6         }
 7         //pattern长度为1
 8         if(p.length() == 1){
 9             return s.length() == 1 && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.');
10         }
11         
12         //经过上面两个if, 此时pattern的长度已经大于等于2
13         if(p.charAt(1) != '*'){ //p第二个字符不是 '*'
14             return s.length()>0 
15             && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.') //第一个字符是否相等 或者pattern第一个字符是'.'
16             && isMatch(s.substring(1),p.substring(1)); //剩下的字符串是否match
17         }else{  //p第二个字符是 '*'
18             //一次去掉pattern两个字符,看剩下的pattern 能否和 s match
19             //可以理解为 * 代表0个字符
20             //若有一层match 上了 就return true
21             if(isMatch(s, p.substring(2))){
22                 return true;
23             }
24             return s.length()>0 //字符串长度需要大于0
25             && (s.charAt(0) == p.charAt(0) || p.charAt(0) == '.') //当前字符串相等 或者pattern第一个字符是'.'
26             && isMatch(s.substring(1), p); //去掉s的首字符
27         }
28     }
29 }

Ref: http://harrifeng.github.io/algo/leetcode/regular-expression-matching.html

方法二是用DP, 其实是一个思路.

需要存储的历史信息dp[i][j] 代表s[0, i-1] 和 p[0, j-1]是否能match上,最后返回dp[s.length()][p.length()]. 所以dp生成时要设size成new boolean[s.length()+1][p.length()+1].

状态转移时 如果当前的char能match上, dp[i][j] = dp[i-1][j-1]. 否则的话如果p的当前char是'*', 要看p的前个char能否和s的当前char match上. 不能的话,这个'*'只能代表0个字符. dp[i][j] = dp[i][j-2].

如果能match上的话, 既可以代表0个字符也可以代表多个字符. dp[i][j] = dp[i][j-2] || dp[i-1][j].

Time Complexity: O(m*n). Space: O(m*n).

AC Java:

 1 public class Solution {
 2     public boolean isMatch(String s, String p) {
 3         int m = s.length();
 4         int n = p.length();
 5         boolean [][] dp = new boolean[m+1][n+1];
 6         dp[0][0] = true;
 7         
 8         for(int j = 1; j<=n; j++){
 9             if(p.charAt(j-1) == '*'){
10                 dp[0][j] = dp[0][j-2];
11             }
12         }
13         
14         for(int i = 1; i<=m; i++){
15             for(int j = 1; j<=n; j++){
16                 char sChar = s.charAt(i-1);
17                 char pChar = p.charAt(j-1);
18                 //若是首字符match
19                 if(sChar == pChar || pChar == '.'){
20                     dp[i][j] = dp[i-1][j-1];
21                 }else if(pChar == '*'){ //pattern 末尾是 * 
22                     //pattern * 前一个char 和 pChar match, 可以是贪婪性减掉string的最后一char
23                     if(sChar == p.charAt(j-2) || p.charAt(j-2) == '.'){
24                         dp[i][j] = dp[i][j-2] | dp[i-1][j];
25                     }else{
26                         //pattern * 前一个 char 和pChar match不上,*代表0个preceding element
27                         dp[i][j] = dp[i][j-2];
28                     }
29                 }
30             }
31         }
32         return dp[m][n];
33     }
34 }

跟上Wildcard Matching.

转载于:https://www.cnblogs.com/Dylan-Java-NYC/p/4951782.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 怎么在JSX里使用自定义属性?

[react] 怎么在JSX里使用自定义属性&#xff1f; data-xxx"aaa"。 dataset取值 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

几种仪表放大器电路总结

一般模拟信号在进入A/D采样前&#xff0c;需要先进行信号调理&#xff0c;模拟信号放大部分需要着重设计。放大电路采用仪表放大器&#xff0c;其能有效抵抗共模干扰且具有很高的输入电阻&#xff0c;有效提高信噪比。 以下总结常用的仪表模拟放大电路设计。 1、单运放仪表放…

SQL 并联更新

UPDATE o SET col2 c.col3 FROM bo1 AS o JOIN bo2 AS c ON c.col3<> WHERE c.col3<> UPDATE o SET split c.datecount FROM Order_Refund_Table AS o JOIN t2 AS c ON o.ordernoc.orderno 转载于:https://www.cnblogs.com/ilookbo/p/4952348.h…

电流传感器技术总结

1、技术原理分类 电流传感器技术根据原理分为四大类&#xff1a; 根据欧姆定律&#xff0c;通过在电路中串联一个小的取样电阻&#xff0c;测量电阻上的电压&#xff0c;反推出电流&#xff1b;根据电磁感应定律&#xff0c;通过电磁感应耦合测量二次侧的电流大小&#xff0c…

LInux 字符设备驱动程序

#include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> #include <asm/uaccess.h> MODULE_LICENSE("GPL");// 设置这个模块的协议为 GPL #define MAJOR_NUM 2918 //主设备号 //声明Read函数 static ssize_t devi…

信号量使用入门

/*演示如何使用semaphore进行互斥访问说明: read1, read2, read3互斥访问, write等三个read读完后才能写&#xff0c;通过信息量进行控制 */#include<windows.h> #include<process.h> #include<iostream>using namespace std;CRITICAL_SECTION cs; // cri…

IEEE1459功率理论计算方法

0、ADC采集5通道电压&#xff08;ABCN地&#xff09;&#xff0c;4通道电流采用每周波1024点同步采样 1、计算各相&#xff08;Ua、Ub、Uc&#xff09;、线电压&#xff08;Uab、Uac、Ubc&#xff09;&#xff0c;相电流&#xff08;Ia、Ib、Ic&#xff09; 2、计算各相电压、…

python webdriver 常用元素操作

1、新建实例 xx_driver os.path.abspath(r"路径") os.environ["webdriver.xx.driver"] xx_driver driver webdriver.xx(xx_driver) 2、id、name、tag、css、link_text、xpath元素定位 driver.find_element_by_id("xxx") driver.find_element_…

[react] React中怎么检验props?

[react] React中怎么检验props&#xff1f; PropTypes 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

HIPS 自定义框架

整理&#xff1a;Baker 2011.8.17 特别感谢zengjian96帮我排版 对关键程序注入运行防护&#xff1a; *.bat *.cmd *.com *.dll *.drv *.exe *.lnk *.ocx *.pif *.scr *.sys 关键文件/程序防护&#xff1a; Cacls.exe cmd.exe command.com cscript.exe csrss.exel debug.exe d…

使用Visio 2000逆向工程将代码转换为UML图表

From: http://www.sudu.cn/info/html/website/20080508/307109.html 摘要&#xff1a;Microsoft Visio 2000 Professional Edition 和 Enterprise Edition 包含通过逆向工程将 Microsoft Visual C、Microsoft Visual Basic 和 Microsoft Visual J 代码转换为统一建模语言 (UM…

POJ1177 Picture 线段树+离散化+扫描线

求最终的覆盖图形周长&#xff0c;写这种代码应该短而精确&#xff0c;差的比较远 /* Problem: 1177 User: 96655 Memory: 348K Time: 32MS Language: C Result: Accepted */ #include<iostream> #include<stdio.h> #include<stdlib.h>…

DA模拟量控制外接600V高压直流源-设计分析

一、STM32 12位AD DA线性度测试 配置STM32 DA为12bit输出&#xff0c;AD为12bit检测&#xff0c;测试AD和DA的线性度与误差。DAC从0到2.49V步进1mV。ErrorDAC 为标准值减去 ADC的测量值。 板子的Vref2.5V&#xff0c;ADC和DAC的极限为2.5V&#xff0c;测试时直接用杜邦线连接…

[react] React的displayName有什么作用?

[react] React的displayName有什么作用&#xff1f; displayName:定义调试时的组件name 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

使用 rose 将 c++代码转换为 uml 类图

From: http://www.cppblog.com/prayer/archive/2009/12/24/103954.html 阅读本文章&#xff0c;你需要对 uml 有简单的了解&#xff0c;懂得以下术语&#xff1a; 类图( class diagram ) 即 c 中的 class 。 聚合( Aggregation ) 即我们c中的引用。表现为 class 头文件中的…

android中的AIDL进程间通信

关于IPC应该不用多介绍了&#xff0c;Android系统中的进程之间不能共享内存&#xff0c;那么如果两个不同的应用程序之间需要通讯怎么办呢&#xff1f;比如公司的一个项目要更新&#xff0c;产品的需求是依附于当前项目开发一个插件&#xff0c;但是呢这个插件功能以及界面比较…

某测试仪控制系统的设计方案--ARM+FPGA+NIOS

一、系统要求 控制功能&#xff1a;600V直流电源模块控制63dB程控衰减器触摸屏高频毫伏表示波器USB存储FAR计数整形阈值调节。 功能要求&#xff1a; 检测高压电源的Vref控制高压电源的Vset控制光脉冲幅度控制阈值计数幅度存储测量数据触摸屏通信示波器通信高频毫伏表通信光…

[react] 为什么属性使用className而不是class呢?

[react] 为什么属性使用className而不是class呢&#xff1f; class是关键字js会使用dom.className获取样式名&#xff0c;跟js保持一致 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

QT实现图像处理-傅立叶变换、傅立叶反变换、平滑、锐化与模板匹配

From: http://www.cnblogs.com/qytan36/archive/2010/04/04/1704226.html 实验环境&#xff1a; 1&#xff0c;Linux操作系统 2&#xff0c;QT3编程开发环境 3&#xff0c;C编程语言 傅立叶变换和傅立叶反变换 1.1. 主要源代码 readImage() 从图像中读取数据 writeImage() 往图…

Java finally语句到底是在return之前还是之后执行?

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行&#xff1f;很多人都说不是&#xff0c;当然他们的回答是正确的&#xff0c;经过我试验&#xff0c;至少有两种情况下finally语句是不会被执行的&#xff1a; &#xff08;1&…