LeetCode刷题记录——10正则表达式匹配
一 题目描述
给你一个字符串s 和一个字符规律p ,请你实现一个支持 ‘.’ 和 ‘*’的正则表达式匹配。
‘.' 匹配任意单个字符
‘*'匹配零个或多个前面的那一个元素
-
示例:
-
输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串
-
输入: s = "aa" p = "a*" 输出: true 解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次
-
输入: s = "aab" p = "c*a*b" 输出: true 解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"
-
二 思路:
.比较好解决,但是*就不好解决了,因为*前面既可以是普通字符,也可以是. ,情况比较复杂,因此考虑能不能使用动态规划,将一个复杂的问题转换为一个一个小的问题,从而缩减问题的规模。从局部开始,使用递归的方式进行处理
- 当前的匹配字符串p为空时,如果此时s为空,则返回true,反之返回false
- 当前的匹配字符串p不为空时,那么需要分情况考虑,考虑下一位是否含有*,并且假设当前字符位置匹配情况为currentmatch:
- 如果下一位有*:
- 当前字符串出现0次,那么无论current匹配与否,都return isMatch(s,p.substr(2));
- 当前字符串至少出现一次,那么至少当前应该匹配成功,并且递归求解,return current && isMatch(s.substr(1),p.substr(2));
- 下一位不具有*:
- 如果当前匹配成功,则继续递归求解
- 若匹配失败,直接返回false
- 如果下一位有*:
bool isMatch(const char* s,const char* p){
//c字符串是以\0结尾的
if(*p==0) return *s==0;
bool currentmatch=(*s!=0) && (*s==*p||*p=='.');
if(*(p+1)=='*'){
return isMatch(s,p+2)|| currentmatch&&isMatch(s+1,p);
}else{
return currentmatch&&isMatch(s+1,p+1);
}
}
bool IsMatch(string s, string p) {
//string对象的.c_str()返回一个c字符串的指针,即const char *
return isMatch(s.c_str(),p.c_str());
}