1. // 面试题19:正则表达式匹配
  2. // 题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'
  3. // 表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题
  4. // 中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"
  5. // 和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。
  6.  
  7. #include <iostream>
  8. using namespace std;
  9.  
  10. bool matchCore(const char* str, const char* pattern);
  11.  
  12. bool match(const char* str, const char* pattern)
  13. {
  14. if (str == nullptr || pattern == nullptr)
  15. return false;
  16.  
  17. return matchCore(str, pattern);
  18. }
  19.  
  20. bool matchCore(const char* str, const char* pattern)
  21. {
  22. if (*str == '\0' && *pattern == '\0')//我去,还有这样的,这样的案例我老是想不到
  23. return true;
  24.  
  25. if (*str != '\0' && *pattern == '\0')
  26. return false;
  27.  
  28. if (*(pattern + ) == '*')//当第二个是*
  29. {
  30. if (*pattern == *str || (*pattern == '.' && *str != '\0'))////首字母一样,进入有限状态机的下一个状态
  31. return matchCore(str + , pattern + )//可能重复一次
  32. || matchCore(str + , pattern) //可能不止重复一次
  33. || matchCore(str, pattern + );//可能一次都没有,略过一个'*'
  34. else
  35. //说明第一个字母不匹配,必须略过一个'*'
  36. return matchCore(str, pattern + );
  37. }
  38.  
  39. if (*str == *pattern || (*pattern == '.' && *str != '\0'))//当第二个不是*
  40. return matchCore(str + , pattern + );
  41.  
  42. return false;
  43. }
  44.  
  45. // ====================测试代码====================
  46. void Test(const char* testName, const char* string, const char* pattern, bool expected)
  47. {
  48. if (testName != nullptr)
  49. printf("%s begins: ", testName);
  50.  
  51. if (match(string, pattern) == expected)
  52. printf("Passed.\n");
  53. else
  54. printf("FAILED.\n");
  55. }
  56.  
  57. int main(int argc, char* argv[])
  58. {
  59. Test("Test01", "", "", true);
  60. Test("Test02", "", ".*", true);
  61. Test("Test03", "", ".", false);
  62. Test("Test04", "", "c*", true);
  63. Test("Test05", "a", ".*", true);
  64. Test("Test06", "a", "a.", false);
  65. Test("Test07", "a", "", false);
  66. Test("Test08", "a", ".", true);
  67. Test("Test09", "a", "ab*", true);
  68. Test("Test10", "a", "ab*a", false);
  69. Test("Test11", "aa", "aa", true);
  70. Test("Test12", "aa", "a*", true);
  71. Test("Test13", "aa", ".*", true);
  72. Test("Test14", "aa", ".", false);
  73. Test("Test15", "ab", ".*", true);
  74. Test("Test16", "ab", ".*", true);
  75. Test("Test17", "aaa", "aa*", true);
  76. Test("Test18", "aaa", "aa.a", false);
  77. Test("Test19", "aaa", "a.a", true);
  78. Test("Test20", "aaa", ".a", false);
  79. Test("Test21", "aaa", "a*a", true);
  80. Test("Test22", "aaa", "ab*a", false);
  81. Test("Test23", "aaa", "ab*ac*a", true);
  82. Test("Test24", "aaa", "ab*a*c*a", true);
  83. Test("Test25", "aaa", ".*", true);
  84. Test("Test26", "aab", "c*a*b", true);
  85. Test("Test27", "aaca", "ab*a*c*a", true);
  86. Test("Test28", "aaba", "ab*a*c*a", false);
  87. Test("Test29", "bbbba", ".*a*a", true);
  88. Test("Test30", "bcbbabab", ".*a*a", false);
  89. system("pause");
  90. return ;
  91. }

《剑指offer》第十九题(正则表达式匹配)的更多相关文章

  1. 剑指offer五十二之正则表达式匹配

    一.题目 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  2. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  3. 剑指offer(leetcode 10.) 正则表达式匹配

    这题一年前就做过,当时刚开始刷leetcode,提交了几十次过不去,就放那没管了.今天剑指offer又遇到这题,终于做出来了,用的dp. class Solution { public: bool i ...

  4. 剑指offer——面试题19:正则表达式匹配

    #include"iostream" using namespace std; bool MatchCore(char*str,char* pattern); bool Match ...

  5. 【剑指offer】面试题 19. 正则表达式匹配

    面试题 19. 正则表达式匹配

  6. 剑指Offer(十九)——顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如,如果输入如下4 X 4矩阵: 1   2    3     4 5   6    7     8 9   10  11  ...

  7. 剑指offer五十九之按之字形顺序打印二叉树

    一.题目 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推.二.思路 详见代码 三.代码 import j ...

  8. 剑指offer四十九之把字符串转换成整数

    一.题目 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 二.思路 详见代码. 三.代码 public class Solution { ...

  9. 剑指offer三十九之平衡二叉树

    一.题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 二.思路 详解代码. 三.代码 public class Solution {     //判断根节点左右子树的深度,高度差超过1,则不平衡 ...

  10. 剑指offer二十九之最小的K个数

    一.题目 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.思路 详解代码. 三.代码 import java.util. ...

随机推荐

  1. boost--smart_ptr库

    C++没有类似Java.C#等语言的垃圾回收机制,内存管理是最为头痛的工作. new.delete以及指针的不恰当运用是C++中造成资源获取/释放问题的根源. 智能指针是解决这些问题的一种方案,boo ...

  2. android studio 错误: 编码GBK的不可映射字符

    在模块的build.gradle中加入: tasks.withType(JavaCompile) { options.encoding = "UTF-8" } JavaCompil ...

  3. http协议基础(七)通用首部字段

    通用首部字段的意思,就是:请求和响应报文双方都会使用的首部 1.Cache-Control 通过指定它的指令,能操作缓存的工作机制 指令参数是可选的,多个指令通过“,”分隔 Cache-Control ...

  4. Bootstrap下拉单学习

    <!DOCTYPE HTML><html><head><link rel="stylesheet" href="/stylesh ...

  5. mysql的innodb存储引擎和myisam存储引擎的区别

    主要区别如下: 1.事务支持.innodb支持事务,事务(commit).回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transacti ...

  6. LibSVM源码剖析(java版)

    之前学习了SVM的原理(见http://www.cnblogs.com/bentuwuying/p/6444249.html),以及SMO算法的理论基础(见http://www.cnblogs.com ...

  7. MySQL从删库到跑路(五)——SQL查询

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 1.查询所有字段 在SELECT语句中使用星号“”通配符查询所有字段在SELECT语句中指定所有字段select f ...

  8. Azkaban 简介

    本文简单介绍一下Azkaban及其特点.azkaban是一个开源的任务调度系统,用于负责任务的调度运行(如数据仓库调度),用以替代linux中的crontab. 一.Azkaban是什么? 1.1 A ...

  9. linux查看文件夹大小,备份文件夹zip压缩解压

    linux查看文件夹大小,备份文件夹zip压缩解压 du -sh : 查看当前目录总共占的容量.而不单独列出各子项占用的容量 du -lh --max-depth=1 : 查看当前目录下一级子文件和子 ...

  10. Django框架----视图函数补充

    视图函数的补充 1.视图函数:一定是要包含两个对象的(render源码里面有HttpResponse对象)   request对象:----->所有的请求信息   HttpResponse:-- ...