剑指offer:正则表达式匹配

本文详细解析了如何使用递归方法实现一个正则表达式匹配函数,该函数能够处理包含'.'和'*'的复杂模式,其中'.'表示任意一个字符,'*'表示其前字符可重复任意次。文章通过具体代码示例,阐述了各种情况下的匹配逻辑,适用于理解正则表达式的高级应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

 

思路分析:

这里要注意审题,一开始看的时候以为是两个模式串的匹配。后来发现一个就是普通的字符串,而另一个才是所谓的模式串,即包含了'.'和'*'。

这类题目需要考虑的比较全面,对各个情况进行分析,并没有太多的技巧点和算法在其中,用到的就是递归。具体的解析在注释当中有进行说明。

 

代码:

 1 class Solution {
 2 public:
 3     bool match(char* str, char* pattern)
 4     {
 5         // 若为空指针,则返回false
 6         if(str==nullptr || pattern==nullptr)
 7             return false;
 8         return matchCore(str, pattern);
 9     }
10     
11 private:
12     bool matchCore(char* str, char* pattern)
13     {
14         // 若都走到结尾,则返回true
15         if(*str=='\0' && *pattern=='\0')
16             return true;
17         // 字符串没到结尾,而模式串到了,则返回false
18         if(*str!='\0' && *pattern=='\0')
19             return false;
20         // 字符串到了结尾,而模式串没到,则需要继续判断,对后续'*'做处理
21         if(*(pattern+1)=='*')
22         {
23             // 若当前字符串与模式串匹配或模式串为'.'且字符串不到结尾
24             if(*str==*pattern || (*pattern=='.' && *str!='\0'))
25             {
26                 // 只匹配当前的这个字符后,跳过模式串的'*'
27                 return matchCore(str+1, pattern+2) || 
28                     // 继续对后续的字符匹配'*'
29                     matchCore(str+1, pattern) ||
30                     // 当前字符也不对'*'匹配,跳过这个模式
31                     matchCore(str, pattern+2);
32             }
33             // 否则,当前的字符与模式不匹配,则跳过'*'这个模式
34             else
35             {
36                 return matchCore(str, pattern+2);
37             }
38         }
39         // 当前的模式串没有'*',则需要判断模式串和字符串是否相等,或判断模式串为'.'且字符串不到末尾
40         if(*str==*pattern || (*pattern=='.' && *str!='\0'))
41         {
42             return matchCore(str+1, pattern+1);
43         }
44         return false;
45     }
46 };

 

转载于:https://www.cnblogs.com/LJ-LJ/p/11100371.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值