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

最新文章

  1. ENGLISH抠脚童鞋的福利--GitHub汉化插件
  2. EF 资料
  3. jQuery Mobile 可折叠
  4. “数学口袋精灵”第二个Sprint计划(第十天)总结
  5. SQL行转列
  6. ROS程序编辑器
  7. Keil RTX systick 初始化
  8. 【C#学习笔记】获取当前应用程序所在路径及环境变量
  9. hdu 3778
  10. DP的简单应用
  11. php静态方法与非静态方法在性能上有什么区别?
  12. css_day7
  13. 普通内存、ECC内存和REG ECC内存有什么不同
  14. Cloudera Hadoop 4 实战课程(Hadoop 2.0、集群界面化管理、电商在线查询+日志离线分析)
  15. JQuery Layer的应用实例
  16. js实现html截图生成图片
  17. 网站发布出现“未能找到路径“path\bin\roslyn\csc.exe”....“和拒绝访问的解决办法
  18. BZOJ3070 : [Pa2011]Prime prime power 质数的质数次方
  19. Real World Parsec --- 一个简便易学的 解释器
  20. thread == 售票

热门文章

  1. [网络流]BZOJ4657 最小割约束
  2. 洛谷P4643 [国家集训队]阿狸和桃子的游戏(思维题+贪心)
  3. 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)
  4. An SDN-NFV Platform for Personal Cloud Services
  5. 在线批量修改mysql中表结构
  6. Dynamics CRM 如何修复 Access Is Denied - ObjectTypeCode: 2500 的错误
  7. mysql 设置skip_name_resolve参数 日志 [Warning] &#39;user&#39; entry &#39;root@localhost&#39; ignored in --skip-name-resolve mode
  8. C# NPOI 操作Excel 案例
  9. 小程序通过 url 向内嵌 H5 传参注意事项
  10. vue 开发和生产的跨域问题