思路
这个题主要是要充分考虑所有的可能情况,并且分析出每种情况递归的方式
情况一
a ab×
对于上面a ab×来讲:
第一个字符串结束后第二个字符串没有结束,但这仍然是符合的。因为×前的字符可以出现任意次(包括0次)当b出现0次与第一个字符串匹配了
但是如果第一个字符串没有结束,第二个字符串结束了,一定不符合要求。
情况二
a a.根据题意,这两个字符串不匹配
因为.可以表示任意字符,但是一定有字符,所以这种情况不匹配
情况三
“” “”
两个串为空串,此时算作匹配的情况
由上面的三种情况可知(原串设为str 正则表达式串设为pattern)
我们用两个指针来分别指向两个串的起点,当两个指针都指向对应的尾时说明匹配成功。由上面分析可知pattern为空str不为空时一定没有匹配成功。但是str为空pattern不为空时不能确定是否匹配成功,所以在下面的代码中要注意判断str是否为空
如果pattern出现×时×前的字符很重要
1.pattern中×前的字符与str字符相同时
①ab a×b
此时str指针+1,pattern指针+2跳过×。此时两个指针都指向字符b
②aab a×b
×前字符可以出现任意次,pattern中a要出现两次
str指针+1,pattern指针不动
③aa a×aa
这时×前的a要出现0次
str指针不动,pattern指针+2
这三种情况为或的关系,因为只要有一种模式匹配都叫匹配成功
2.pattern中×前的字符与str字符不相同时
①aa b×aa
str指针不动,pattern指针+2
C++代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
bool match(string str, string pattern) {
// write code here
return matchCore(str,pattern);
}
bool matchCore(const string&str,const string&pattern){
if(str.empty()&& pattern.empty()){
return true;//两串都为空,此时匹配成功
}
if(!str.empty()&&pattern.empty()){
return false;//pattern为空但str不为空一定不成功
}
//当pattern出现*字符*前的字符很重要
if(pattern[1]=='*'){
if(pattern[0]==str[0]||(pattern[0]=='.'&&!str.empty()))
{
//因为此时str可能为空要判断
//下面对应的为当*前字符相同时的三种情况
return matchCore(str,pattern.substr(2))
|| matchCore(str.substr(1),pattern)
||matchCore(str.substr(1),pattern.substr(2));
}else
{//对应的时pattern*前的字符与str不相同
return matchCore(str,pattern.substr(2));
}
}//当pattern没有*时,看pattern的字符能否和str匹配即可或者此时pattern对应的字符为.因为.可以匹配任意字符
if(str[0]==pattern[0]||(pattern[0]=='.'&&!str.empty()))
{
return matchCore(str.substr(1),pattern.substr(1));
}
return false; //这些情况都不符合是说明没有匹配
}
};