Implement regular expression matching with support for '.' and '*'.

首先这里有个可能大家不知道的地方:

if p[0] = '*', the string must be an invalid string.
that is what Regular Expression defined.

这是别人在评论的时候说的。也就是说,pattern的第一个不可以是*;

  1.  
  1. class Solution {
  2. public:
  3. bool isMatch(string s, string p) {
  4. if (p.empty()) return s.empty();
  5. if ('*' == p[1])
  6. // x* matches empty string or at least one character: x* -> xx*
  7. // *s is to ensure s is non-empty
  8. return (isMatch(s, p.substr(2)) || !s.empty() && (s[0] == p[0] || '.' == p[0]) && isMatch(s.substr(1), p));
  9. else
  10. return !s.empty() && (s[0] == p[0] || '.' == p[0]) && isMatch(s.substr(1), p.substr(1));
  11. }
  12. };
  13. class Solution {
  14. public:
  15. bool isMatch(string s, string p) {
  16. /**
  17. * f[i][j]: if s[0..i-1] matches p[0..j-1]
  18. * if p[j - 1] != '*'
  19. * f[i][j] = f[i - 1][j - 1] && s[i - 1] == p[j - 1]
  20. * if p[j - 1] == '*', denote p[j - 2] with x
  21. * f[i][j] is true iff any of the following is true
  22. * 1) "x*" repeats 0 time and matches empty: f[i][j - 2]
  23. * 2) "x*" repeats >= 1 times and matches "x*x": s[i - 1] == x && f[i - 1][j]
  24. * '.' matches any single character
  25. */
  26. int m = s.size(), n = p.size();
  27. vector<vector<bool>> f(m + 1, vector<bool>(n + 1, false));
  28. f[0][0] = true;
  29. for (int i = 1; i <= m; i++)
  30. f[i][0] = false;
  31. // p[0.., j - 3, j - 2, j - 1] matches empty iff p[j - 1] is '*' and p[0..j - 3] matches empty
  32. for (int j = 1; j <= n; j++)
  33. f[0][j] = j > 1 && '*' == p[j - 1] && f[0][j - 2];
  34. for (int i = 1; i <= m; i++)
  35. for (int j = 1; j <= n; j++)
  36. if (p[j - 1] != '*')
  37. f[i][j] = f[i - 1][j - 1] && (s[i - 1] == p[j - 1] || '.' == p[j - 1]);
  38. else
  39. // p[0] cannot be '*' so no need to check "j > 1" here
  40. f[i][j] = f[i][j - 2] || (s[i - 1] == p[j - 2] || '.' == p[j - 2]) && f[i - 1][j];
  41. return f[m][n];
  42. }
  43. };
  1.  

算法分析-leedcode正则题目的更多相关文章

  1. 正则和grep——再做正则就去死

    grep 文本过滤工具 基本正则表达式 grep 语法 基本正则表达式的元字符 次数匹配 位置锚定 分组 扩展正则表达式 基本正则表达式的元字符 次数匹配 位置锚定 分组 或者 grep的介绍 lin ...

  2. hiho一下 第四十九周 题目1 : 欧拉路·一【无向图 欧拉路问题】

    题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...

  3. poj 1422 Air Raid 最少路径覆盖

    题目链接:http://poj.org/problem?id=1422 Consider a town where all the streets are one-way and each stree ...

  4. POJ_2769同余问题

    Reduced ID Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9310   Accepted: 374 ...

  5. RemoveDuplicatesFromSortedArrayI II,移除有序数组里的重复元素以及移除数组里的某个元素

    RemoveDuplicatesFromSortedArrayI: 问题描述:给定一个有序数组,去掉其中重复的元素.并返回新数组的长度.不能使用新的空间. [1,1,2,3] -> [1,2,3 ...

  6. hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)

    题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 ...

  7. SDUT OJ I样(0-1背包问题 【模板】)

    I样 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 这是个什么问题呢?DP,贪心,数据结构,图论,数论还是计算几何?管他呢,反正 ...

  8. POJ 2309 BST(二叉搜索树)

    BST Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8657   Accepted: 5277 Description C ...

  9. POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )

    Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19884   Accepted: 83 ...

随机推荐

  1. RMAN之一:快速入门

    1.数据导出基础 (1)创建datapump导出文件的目录对象并为相应用户授予权限. 出于安全考虑,不允许oracle用户直接在OS上进行文件的操作,而应通过directory对象指定. SQL> ...

  2. jquery widget开发——核心框架

    框架代码: $.widget("myns.myplugin", { //默认参数 options: { }, //初始化,控件生命周期内只运行一次 _init: function ...

  3. Git使用笔记(一)

    今天第一次使用Git,在本地和CSDN Code进行代码同步.鉴于“好记性不如烂笔头”的经验教训,特把步骤记录下来. 准备工作: 1. 在CSDN(或者Github)上注册一个帐号,然后创建一个Rep ...

  4. 第一局 ThreeJS-开始

    本文介绍ThreeJS使用的大体流程.(由于水平有限,请大家多多指教.) 1.ThreeJS下载和引入: (1)下载地址:https://github.com/mrdoob/three.js/arch ...

  5. 在WPF中自定义你的绘制(三)

    原文:在WPF中自定义你的绘制(三) 在WPF中自定义你的绘制(三)                                                                  ...

  6. android 自定义AlertDialog(一段)

    java: final AlertDialog dialog = new AlertDialog.Builder(mContext) .create(); dialog.setCancelable(f ...

  7. [置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 & 8?

    翻译自:http://www.hakanakdag.net/windows/how-to-create-wireless-ad-hoc-internet-connection-in-windows-8 ...

  8. python图片小爬虫

    import re import urllib import os def rename(name): name = name + '.jpg' return name def getHtml(url ...

  9. Linux常用C函数---字符串转换篇

    函数讲解部分参考http://net.pku.edu.cn/~yhf/linux_c/ atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul 表 ...

  10. 在PHP中处理表单之—Checkbox

    原文翻译自:http://www.html-form-guide.com/php-form/php-form-checkbox.html 单个checkbox  形如: <form action ...