时间限制:1秒 空间限制:32768K 热度指数:256342
本题知识点: 字符串
题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
题目链接:题目链接
这题刚开始看错题,认为*是可以匹配任意字符任意次,再仔细一看,是*只可以匹配它前面的字符任意次。。。绝望,调了n久,才发现。
接下来虽然理解对了题意,有个细节没考虑清楚,又调了好久...面试这样搞,怕是会被毒打。。。
这题分几种情况:
1.当前模式串与匹配串能匹配(相等,或者匹配串为'.')
1.1.如果匹配串下一个字符为'*',那么有两种匹配方案:
1.1.1.匹配串后移2位,相当于匹配0次
1.1.2.模式串后移1位,相当于*匹配多位
1.2.如果匹配串下一字符不为'*',匹配串和模式串都后移1位。
2.当前模式串与匹配串不匹配
2.1.如果匹配串下一个字符为'*',则匹配串后移两位,相当于匹配0次
2.2.如果匹配串下一个字符不为'*',则说明不匹配,返回false。
class Solution {
public:
bool match(char* str, char* pattern)
{
//判断是否模式串和匹配串是否为空
if(str==NULL || pattern ==NULL)
return false;
return isMatch(str,pattern,0,0);
}
bool isMatch(char* str, char* pattern,int len1,int len2)
{
if(str[len1]=='\0' && pattern[len2] == '\0')
return true;
if(str[len1] != '\0' && pattern[len2] == '\0')
return false;
//这里要特别注意模式串为'.'时,要保证当前str还有字符能匹配,就这里调了好久,刚开始写没想到这个细节
if(str[len1] == pattern[len2] || (pattern[len2] == '.' && str[len1] != '\0')){
if(pattern[len2+1] == '*'){
return isMatch(str,pattern,len1,len2+2)
|| isMatch(str,pattern,len1+1,len2);
}
else {
return isMatch(str,pattern,len1+1,len2+1);
}
}
else if(str[len1] != pattern[len2]){
if(pattern[len2+1] == '*'){
return isMatch(str,pattern,len1,len2+2);
}
else {
return false;
}
}
}
};