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

 1 #include"iostream"
 2 using namespace std;
 3
 4 bool MatchCore(char*str,char* pattern);
 5
 6 bool Match(char* str,char* pattern)
 7 {
 8     if(str==nullptr||pattern==nullptr)
 9         return false;
10     return MatchCore(str,pattern);
11 }
12
13 bool MatchCore(char*str,char* pattern)
14 {
15     if(*str==‘\0‘&&*pattern==‘\0‘)
16         return true;
17     if(*(pattern+1)==‘*‘)
18     {
19         if(*str==*pattern||(*pattern==‘.‘&&*str!=‘\0‘))
20             return MatchCore(str,pattern+2)||MatchCore(str+1,pattern+2) || MatchCore(str+1,pattern);
21         else
22             return MatchCore(str,pattern+2);
23     }
24     if(*str==*pattern||(*pattern==‘.‘&&*str!=‘\0‘))
25         return MatchCore(str+1,pattern+1);
26     return false;
27 }
28
29 void Test(char* testName,char* str,char* pattern,bool expect)
30 {
31     cout<<testName<<": ";
32     if(Match(str,pattern)==expect)
33         cout<<"passed."<<endl;
34     else
35         cout<<"failed."<<endl;
36 }
37
38 int main()
39 {
40     Test("test1","aabcaa","a*b*.a*",true);
41     Test("test2","","",true);
42     Test("test3","aaa","a*a.",true);
43     Test("test4",nullptr,nullptr,false);
44     Test("test5","abccdde","b*ab*c*d*e.",false);
45
46     return 0;
47 }

官方答案,测试用例写的真是很详细:

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

原文地址:https://www.cnblogs.com/acm-jing/p/10410362.html

时间: 2024-10-31 22:51:55

剑指offer——面试题19:正则表达式匹配的相关文章

※剑指offer系列41:正则表达式匹配

做这个题目一定要思路清晰,各种情况都要考虑完善. 分为两种情况 1.其中有一个到结尾了 2.两个都没结尾,这里以它的下一位是否为*作为判断条件. 1 class Solution { 2 public: 3 bool match(char* str, char* pattern) 4 { 5 if (str == NULL || pattern == NULL) 6 return false; 7 return matchcore(str, pattern); 8 } 9 bool matchc

剑指Offer面试题19(Java版):二叉树的镜像

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像 二叉树的结构定义为: package utils; public class BinaryTreeNode { public int value; public BinaryTreeNode leftNode; public BinaryTreeNode rightNode; public BinaryTreeNode(){ } public BinaryTreeNode(int value){ this.value = value ;

二叉树层次遍历(剑指Offer面试题32:从上到下打印二叉树)

图1所示为二叉树的层次遍历,即按照箭头所指方向,按照1.2.3的层次顺序,对二叉树每个节点进行访问 (此图反映的是自左至右的层次遍历,自右至左的方式类似). 要进行层次遍历,需要建立一个队列.先将二叉树头节点入队列,然后出队列,访问该节点, 如果它有左子树,则将左子树的根结点入队:如果它有右子树,则将右子树的根结点入队.然后出队列,对出队节点访问, 如此反复直到队列为空为止. 1 import java.util.*; 2 class TreeNode 3 { 4 int val; 5 Tree

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

【剑指Offer面试题】九度OJ1384:二维数组中的查找

下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的.加油~ 题目链接地址: http://ac.jobdu.com/problem.php?pid=1384 二维数组中的查找

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字

题目链接地址: http://ac.jobdu.com/problem.php?pid=1386 题目1386:旋转数组的最小数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:6914解决:1534 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt