https://leetcode.com/problems/regular-expression-matching/description/
题目大意:给正则表达式p,一个字符串s,若正则表达式能匹配成功则为true 否则为false
其中‘*’表示*前的字母可重复0或多次,‘.’可以匹配任意单个字符 例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root
如 ab a*ab true
aab a*b true
ab .* true
思路1:递归:(举出每一种情况)
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<limits.h>
using namespace std;
bool isMatch(string s, string p) {
if(p.empty())
return s.empty();
if(p.size()==1)
{
if((p[0]=='.'||p[0]==s[0])&&s.size()==1)
return true;
return false;
}
if(p.size()>1)
{
if(p[1]!='*'){
if(s.empty()) // a .*..a*
return false;
//if(p[0]==s[0]||p[0]=='.')
// return isMatch(s.substr(1),p.substr(1));
//return false;
return (p[0]==s[0]||p[0]=='.')&&isMatch(s.substr(1),p.substr(1));
}
if(p[1]=='*'){
while((p[0]==s[0]||p[0]=='.')&&!s.empty()){
// if(s.size()==1)
// return true;
if(isMatch(s,p.substr(2)))
return true;
else
s=s.substr(1); //此处可能为空,如ab .* 最后是 空 和 .* 递归,会返回false,然而应为true
//如果坚持这里用递归,添一个if(s.size==1) 那么b b*b 和 ab .*c无法处理
}
return isMatch(s,p.substr(2));
}
}
}
int main(){
string s,p;
cin >> s;
cin >> p;
if(isMatch(s,p))
printf("YES");
else
printf("NO");
return 0;
}