题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
思路:
- 空字符串---false
- 第二个字符串不是*
- 判断是否相等,相等就都往后挪
- 不想等的话,判断是否有 "." ,如果有的话,判断str是否到了
- 第二个模式+1是*
- 判断是不是相等||模式是否有 "." ,str是否到了----str+1(跳过这个字符串,模式不变) || pattern+2(跳过这个模式X*,字符串不变)
- else 直接跳过这个模式,字符串不变
class Solution {
public:
bool matchfunc(char *str,char * pattern)
{
if(*str=='\0'&&*pattern=='\0')
return true;
if(*str!='\0'&&*pattern=='\0')
return false;
if(*(pattern+1)=='*')
{
if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
return matchfunc(str+1,pattern)||matchfunc(str,pattern+2);//str的. 和 pattern的b*抵消了。
else//不相等也没有.
return matchfunc(str,pattern+2);
}
else
{
if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
return matchfunc(str+1,pattern+1);
}
return false;
}
bool match(char *str,char * pattern)
{
if(str==NULL||pattern==NULL)
return false;
return matchfunc(str,pattern);
}
};
感觉题目还是有问题,如果出现 .* 这种正则表达式呢?
我测试了发现不对,识别不出来到底对还是错。
char *str="abaaa";
char *pattern="a.*";
调试代码:
#include <iostream>
using namespace std;
bool matchfunc(char *str,char * pattern)
{
if(*str=='\0'&&*pattern=='\0')
return true;
if(*str!='\0'&&*pattern=='\0')
return false;
if(*(pattern+1)=='*')
{
if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
return matchfunc(str+1,pattern)||matchfunc(str,pattern+2);//str的. 和 pattern的b*抵消了。
else//不相等也没有.
return matchfunc(str,pattern+2);
}
else
{
if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
return matchfunc(str+1,pattern+1);
}
return false;
}
bool match(char *str,char * pattern)
{
if(str==NULL||pattern==NULL)
return false;
return matchfunc(str,pattern);
}
int main()
{
char *str="abaaa";
//char *pattern="ab*ac*a";
char *pattern="a.*";
int Res=match(str,pattern);
return 0;
}