Wildcard-Matching &  Regular Expression Matching

Wildcard-Matching中?匹配任意一个字符,*匹配任意长度字符串包括空字符串

方法一:记录*的位置,分别考虑*匹配空,匹配一个,匹配两个,三个...

     bool isMatch(const char *s, const char *p) {
int sStar=-,pStar=-;
int i=,j=;
for(i=;i<strlen(s);)//不考虑p字符串长 s=''aa'', p=''a''
{
if(p[j]=='*')
{
sStar=i;
pStar=j;
j++;
}
else if(p[j]==s[i]||p[j]=='?')
{
i++;
j++;
}
else if(sStar>=)//没有匹配但之前记录sStar了
{
i = ++sStar;
j = pStar+;
}
else return false;
}
while(p[j]=='*')j++;
return j==strlen(p);
}

方法二:DP dp[i][j]=1表示s[0:i)与p[0:j)匹配,状态转移以*划分两种情况,包含*又有两种状态转移,根据无后效性可知,有匹配空和匹配s中的一个字符这两种

 bool isMatch(const char *s, const char *p) {
int dp[strlen(s)+][strlen(p)+];
memset(dp,,sizeof(dp));
dp[][]=;
for(int j=;j<=strlen(p);j++)
{
if(p[j-]=='*')
dp[][j]=dp[][j-];
}
for(int i=;i<=strlen(s);i++)
for(int j=;j<=strlen(p);j++)
{
if(p[j-]=='*')
dp[i][j]=dp[i][j-]||dp[i-][j];
else
dp[i][j]=dp[i-][j-]&&(s[i-]==p[j-]||p[j-]=='?');
}
return dp[strlen(s)][strlen(p)];
}

Regular Expression Matching

*表示*之前的字符可以有0个,1个或是多个

方法一:递归

注意不应该先判原串s为空,p为*也可以

p[1]==* 需要匹配s中的一个字符时,注意p不能去掉首字符,因为*号前面的字符可以有无限个;

 bool isMatch(string s, string p)
{
if(p.empty())return s.empty();
if(p.size()>&&p[]=='*')
return isMatch(s,p.substr())||(!s.empty() && (s[] == p[] || p[] == '.') && isMatch(s.substr(),p));
else
return !s.empty()&& (p[]==s[]||p[]=='?') && isMatch(s.substr(),p.substr());
}

方法二:DP  dp[i][j]=1表示s[0:i)与p[0:j)匹配

1.  P[i][j] = P[i - 1][j - 1], if p[j - 1] != '*' && (s[i - 1] == p[j - 1] || p[j - 1] == '.');
2.  P[i][j] = P[i][j - 2], if p[j - 1] == '*' and the pattern repeats for 0 times;
3.  P[i][j] = P[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.'), if p[j - 1] == '*' and the pattern repeats for at least 1

 bool isMatch(string s, string p) {
int m = s.size(), n = p.size();
int dp[m+][n+];
memset(dp,,sizeof(dp));
dp[][] = ;
for (int i = ; i <= m; ++i) {
for (int j = ; j <= n; ++j) {
if (j > && p[j - ] == '*') {
dp[i][j] = dp[i][j - ] || (i > && (s[i - ] == p[j - ] || p[j - ] == '.') && dp[i - ][j]);
} else {
dp[i][j] = i > && dp[i - ][j - ] && (s[i - ] == p[j - ] || p[j - ] == '.');
}
}
}
return dp[m][n];
}

参考自:Grandyang

字符串正则匹配(递归/DP)的更多相关文章

  1. iOS截取特定的字符串(正则匹配)

    有时候我们会有需求从一个字符串中截取其他的字符串,根据情况的不同,我们来分析几种方法~~ 一. 固定长度字符串中截取固定位置长度的字符串 // 这是比较简单的一种情况:比如截取手机号的后4位 let ...

  2. Python之字符串正则匹配

    需求: 正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配(因为是贪婪匹配 ). 而你想修改它变成查找最短的可能匹配. import re text2 = 'Computer says &q ...

  3. Python正则匹配递归获得给出目录下的特定类型的文件小技巧

    需求是酱的: 输入一个目录,这个目录包含检测目录的必备信息但不准确需要获得后加工一下,如给出目录:C:\Program Files\Common Files\DESIGNER,需要检测的目录是:C:\ ...

  4. python 计算器的(正则匹配+递归)

    经过2天的长时间的战斗,python计算器终于完成了. import re val="1-2*((60-30*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3 ...

  5. php中的正则函数:正则匹配,正则替换,正则分割 所有的操作都不会影响原来的字符串.

    有一个长期的误解, 如果要分组, 必须用 小括号 和 |, 而不能用 中括号 和 |. [ab|AB]表示的不是 匹配 ab或 AB, 而是表示 匹配 a,b, |, A, B 这5个字符中 的任意 ...

  6. LeetCode10 Hard,带你实现字符串的正则匹配

    本文始发于个人公众号:TechFlow 这是LeetCode的第10题,题目关于字符串的正则匹配,我们先来看题目相关信息: Link Regular Expression Matching Diffi ...

  7. java 正则匹配空格字符串 正则表达式截取字符串

    java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...

  8. ruby 把字符串转为正则匹配表达式

    需求 函数,需要通过参数传递字符串,用来做正则匹配 reg = '[0-9]+' def func(str, reg) str.scan(reg) end 由于 reg 在其它地方定义, reg 是字 ...

  9. PHP用正则匹配字符串中的特殊字符防SQL注入

    本文出至:新太潮流网络博客 /** * [用正则匹配字符串中的特殊字符] * @E-mial wuliqiang_aa@163.com * @TIME 2017-04-07 * @WEB http:/ ...

随机推荐

  1. (转)学习HTML5 Canvas这一篇文章就够了

    作者:做人要厚道2013 原文:https://blog.csdn.net/u012468376/article/details/73350998

  2. shell脚本备份日志文件

    crontab -e crontab -l service crond restart 55 7 * * * /data/app/autoprice7/resin-pro-3.1.15/log_old ...

  3. 第一周java学习总结

    学号 20175206 <Java程序设计>第一周学习总结 教材学习内容总结 第一章是关于JAVA入门的注意事项: 第一章主要按照顺序讲了JAVA的地位,诞生,特点,JDK的安装,一些ja ...

  4. 关于vue的增删改查操作

    利用vue也可以实现数据的增删改查,只是未涉及到数据库,只是在浏览器页面中进行操作. 将datas数组中的数据循环输出: 再增加一行,用于保存新数据,编辑数据后保存: 此时,数据已经呈现出来,开始进行 ...

  5. 分布式协调服务Zookeeper集群监控JMX和ZkWeb应用对比

    分布式协调服务Zookeeper集群监控JMX和ZkWeb应用对比 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. JMX是用来远程监控Java应用的框架,这个也可以用来监控其他的J ...

  6. 关于snmp octet string和普通string问题

    我是获取的Octet String用String输出,输出的是一连串的2个16进制数 空格.:然后想对输出结果操作,得到我想要的值. 解决方案:private static string exchan ...

  7. DirectX11 With Windows SDK--27 计算着色器:双调排序

    前言 上一章我们用一个比较简单的例子来尝试使用计算着色器,但是在看这一章内容之前,你还需要了解下面的内容: 章节 26 计算着色器:入门 深入理解与使用缓冲区资源(结构化缓冲区/有类型缓冲区) Vis ...

  8. HBase读写的几种方式(三)flink篇

    1. HBase连接的方式概况 主要分为: 纯Java API读写HBase的方式: Spark读写HBase的方式: Flink读写HBase的方式: HBase通过Phoenix读写的方式: 第一 ...

  9. MySQL巧建sum索引帮我们提高至少100%的效率

    有两个表,表a CREATE TABLE `a` ( `id` mediumint() unsigned NOT NULL AUTO_INCREMENT, `fid` ) unsigned ', `c ...

  10. Python自动化中的鼠标事件

    1)form selenium.webdriver.common.action_chains import ActionChains  导入该模块 2)ActionChains(driver) :用于 ...