正则表达式匹配C++代码实现
正则表达式匹配的解决需要用到递归和动态规划的知识。
递归和动态规划之间是有密切的联系的。动态规划的实质就是带有缓存区的递归。
递归实现阶乘。
#include <iostream>using namespace std;//计算阶乘的函数long CalcJiecheng(int num){int res = 0;if (1== num) //边界条件{res = 1;}if (num>1) //递归公式{res = num*CalcJiecheng(num-1);}return res;}int main(){long res = CalcJiecheng(5);cout<<"5的阶乘:"<<res<<endl;system("pause");return 0;}
动态规划会有一个状态转移方程来存取每次递归调用的状态值,这样算法的效率会有所提高,就会省去很多的重复计算。
动态规划算法的难点在于 从实际问题中抽象出动态规划表dp,dp一般是一个数组,可能是一维的也可能是二维的,也可能是其他的数据结构:整个求解过程就可以用一个最优决策表来描述,最优决策表可以是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题的在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解:
f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+P(n,m)}
————————————————
版权声明:本文为CSDN博主「MISAYAONE」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/misayaaaaa/article/details/71940779
递归调用最简单也是最经典的例子就是台阶问题。
有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法?
n阶台阶,只可能是从n-1或是n-2的台阶上走上来的,台阶n的阶段依赖的是n-1和n-2的子阶段,所以状态转移方程为dp[n] = dp[n-1] + dp[n-2],属于最简单的动态规划问题
#include <iostream>#define N 20 //台阶数为20using namespace std;int dp[N]; //全局数组,存放决策表int fun(int n) //返回台阶数为n的走法{if (n == 1 || n == 2){return n;}dp[n-1] = fun(n-1); //若不为1或2则进行递归计算dp[n-2] = fun(n-2);dp[n] = dp[n-1]+dp[n-2]; //状态转移方程return dp[n];}int main(int argc,char** argv){fun(N);cout<<dp[15]<<endl; //输出15阶的走法system("pause");return 0;}
铺垫完毕,言归正传。
在匹配字符的过程中需要分类讨论。如果p中有.字符,那么很好办,因为它是万能字符,我们直接跳过就可以,在程序中就是直接判为1.如果P中有*号可能就会麻烦些。我们需要重点讨论下带*和不带*的情况。不带*号也好办,只要和s中的字符逐一对比就行。如果带字符*就需要分两种情况。见图
分析完毕上代码
class Solution
{public:bool isMatch(string s,string p){return isMatch(s.c_str(),p.c_str());}bool isMatch(const char*s,const char *p){if(*p==0)return *s==0;auto first_match=*s&&(*s==*p||*p=='.');if(*(p+1)=='*'){return isMatch(s,p+2)||(first_match && isMatch(++s,p));}else {return first_match && isMatch(++s,++p);}}} ;
正则表达式匹配C++代码实现相关推荐
- 正则表达式匹配字符串(scala)
正则表达式匹配字符串 代码 import scala.util.matching.Regexobject RegDemo extends App{//构建正则表达式//方式一val pattern1= ...
- Leetcode怎么调试java代码,LeetCode–正则表达式匹配
深入浅出node. js+node学习指南书 208.6元 (需用券) 去购买 > LeetCode–正则表达式匹配 博客说明文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总, ...
- python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构
unutbu.. 14 编辑: falsetru的嵌套解析器,我稍微修改为接受任意正则表达式模式来指定分隔符和项目分隔符,比我原来的re.Scanner解决方案更快更简单: import re def ...
- 概述VB.NET正则表达式简化程序代码
经过长时间学习VB.NET正则表达式,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西.在通常的程序设计中,对字符串的操作是不可缺少的部分.例如,我们经常需要从字符串中寻找特定的 ...
- python正则匹配ip地址_Python正则表达式匹配ip地址实例
Python正则表达式匹配ip地址实例 更新时间:2014年10月09日 11:22:51 投稿:shichen2014 这篇文章主要介绍了Python正则表达式匹配ip地址实例,通过简单的实例讲述了 ...
- LeetCode精讲题 10正则表达式匹配(动态规划)
标题 题目描述 递归(超时) 动态规划 结语 题目描述 先点赞再观看.帅哥靓女养成好习惯. 10 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和'*'的正则表达 ...
- php 上万关键字匹配,JavaScript 上万关键字瞬间匹配实现代码
JavaScript 上万关键字瞬间匹配实现代码 更新时间:2013年07月07日 23:36:21 作者: 发一篇之前写的文章,平时还是经常用到的,尤其是河蟹词特别多的聊天系统里 提到关键字搜索 ...
- python3 正则表达式 嵌套表格_在Python中将嵌套结构与正则表达式匹配
喵喵时光机 falsetru的嵌套解析器(我稍作修改以接受任意正则表达式模式以指定分隔符和项目分隔符)比我的原始re.Scanner解决方案更快,更简单:import redef parse_nest ...
- 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...
最新文章
- C语言嵌入式系统编程修炼之(六)性能优化
- Lync Server 2010移动功能部署PART B:外部篇
- pyspark DataFrame 转RDD
- win7完整卸载oracle11,win7安装与卸载oracle11g(32)
- proe3.0安装教程
- 解决数据库 Table 'content_tags' is marked as crashed and should be repaired 表损坏问题
- Libra白皮书解读
- 2017年4月21号课堂笔记
- 近7成开发者无开源收入、最想操作系统开源、Java最受欢迎 | 揭晓中国开源开发者现状...
- iOS学习笔记之正则表达式
- WebSocket 测试
- AJAX技术开发Back按钮问题的应用程序
- 半导体行业半双工(HDX)低频工业RFID读写器|读卡器CK-S640-AP60E之MODBUS TCP 协议说明
- 介绍兴趣爱好的网页html,介绍兴趣爱好的作文5篇
- java节假日算法_「国家法定节假日」java 国家法定节假日和双休日判断工具类 - seo实验室...
- mysql多表查询详解
- 电商行业如何投放UC头条信息流广告?UC广告投放的扣费模式
- 接收机的指标-噪声、灵敏度、动态范围
- Vue、elmentUI国际化 vue-i18n项目实行简繁体切换
- 计算机磁盘损坏问题与系统的重置和重装