题目描述:
请实现支持’.‘and’’.的通配符模式匹配
‘.’ 可以匹配任何单个字符。↵’’ 可以匹配任何字符序列(包括空序列)。↵↵匹配应该覆盖整个输入字符串(而不是部分)。 ↵函数声明为:↵bool isMatch(const char s, const char p)↵↵下面给出一些样例:↵isMatch(“aa”,“a”) → false↵isMatch(“aa”,“aa”) → true↵isMatch(“aaa”,“aa”) → false↵isMatch(“aa”, "a") → true↵isMatch(“aa”, ".") → true↵isMatch(“ab”, “.") → true↵isMatch(“aab”, "ca*b”) → true
题目解析:
字符’.‘只可以匹配任何一个单字符,而’ * ‘代表其前面的字符可以出现任意多次。
常规思路是肯定要考虑到有没有 ’ * ’ 出现的,不妨只考虑前两个字符,然后用递归的方式实现整个字符串的匹配过程:
A. 若p的第二个字符不是’ * ‘,则s和p的第一个字符要么相等要么p中有’ . ‘,才能进行接下来的配准,s和p都要移动一个指针进行接下来的递归,否则返回false;
B. 若p的第二个字符是 ’ * ‘,若第一个字符能匹配(s和p第一个字符相等或者p中含有’.’),考虑接下来的递归:若‘ * ’表示p中的第一个字符出现0次,则递归s和p+2,若‘ * ’表示p中的第一个字符至少出现一次,则递归s+1和p; 若第一个字符不相等,则递归s和p+2。
依次搜索递归,直到到达s和p的末尾。
class Solution {
public:
bool isMatch(const char *s, const char *p) {
if(s[0]==0&&p[0]==0)return true;
if(s[0]!=0&&p[0]==0)return false;
if(p[1]!='*'){
if(s[0]==p[0]||(s[0]!=0&&p[0]=='.')){
return isMatch(s+1, p+1);
}
else return false;
}
else{
if(s[0]==p[0]||(s[0]!=0&&p[0]=='.')){
return isMatch(s,p+2)||isMatch(s+1,p);
}
else{
return isMatch(s,p+2);
}
}
}
};
【不卑不亢】