本文主要是介绍3.6正则表达式匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.题目
- 2.代码
1.题目
- 题目要求
- 思路
道题中的*表示之前那个字符可以有0个,1个或是多个,就是说,字符串 a*b,可以表示b或是 aaab,即a的个数任意,这道题的难度要相对之前那一道大一些,分的情况的要复杂一些,需要用递归 Recursion 来解,大概思路见注释
(2)
2.代码
class Solution{
public:bool isMatch(string s, string p){(1)若p为空,若s也为空,返回 true,反之返回 false。if (p.empty()) return false;(2)若p的长度为1,若s长度也为1,且相同或是p为 '.' 则返回 true,反之返回 false。if (p.size()==1)return (s.size() ==1) && (p[0] == s[0]|| p[0] == '.');(3)若p的第二个字符不为*,若此时s为空返回 false,否则判断首字符是否匹配,且从各自的第二个字符开始调用递归函数匹配if (p[2] != '*'){if (s.empty()) return false;return (p[0] == s[0]|| p[0] == '.') && (isMatch(s.substr(1),p.substr(1)));}(4)若p的第二个字符为*,进行下列循环:条件是若s不为空且首字符匹配(包括 p[0] 为点),调用递归函数匹配s和去掉前两个字符的p(这样做的原因是假设此时的星号的作用是让前面的字符出现0次,验证是否匹配),若匹配返回 true,否则s去掉首字母(因为此时首字母匹配了,我们可以去掉s的首字母,而p由于星号的作用,可以有任意个首字母,所以不需要去掉),继续进行循环while (!s.empty() && (p[0] == s[0]|| p[0] == '.')){前面的*号已经判断过了if (isMatch(s,p.substr(2))) return true;s=s.substr(1);}return isMatch(s,p.substr(2));}};
这篇关于3.6正则表达式匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!