題目描述:
https://leetcode-cn.com/problems/regular-expression-matching/
解題思路:
代碼實現:
class Solution {
public:
bool isMatch(string s, string p) {
if (p.empty()) return s.empty();
if (p.size() == 1) {
return (s.size() == 1 && (s[0] == p[0] || p[0] == '.'));
}
if(p[1] == '*'){
if(s[0] == p[0] || (!s.empty()&& p[0] == '.')){
return isMatch(s, p.substr(2))||isMatch(s.substr(1), p);
}
else
return isMatch(s, p.substr(2));
}
else{
if(s[0] == p[0] || (!s.empty()&& p[0] == '.')){
return isMatch(s.substr(1), p.substr(1));
}
else
return false;
}
}
};
劍指offer裏參數類型爲char*
class Solution {
public:
bool match(char* str, char* pattern)
{
if(*str == '\0' && *pattern == '\0')
return true;
if(*str != '\0'&&*pattern == '\0')
return false;
if(*(pattern+1) == '*'){
if (*str == *pattern || (*str != '\0' && *pattern == '.'))
return match(str, pattern+2) || match(str+1, pattern);
else
return match(str, pattern+2);
}else{
if(*str == *pattern|| *str!='\0'&&*pattern == '.')
return match(str+1,pattern+1);
else
return false;
}
}
};
更簡便的寫法:
來源:https://www.cnblogs.com/grandyang/p/4461713.html
先來判斷p是否爲空,若爲空則根據s的爲空的情況返回結果。當p的第二個字符爲*號時,由於*號前面的字符的個數可以任意,可以爲0,那麼我們先用遞歸來調用爲0的情況,就是直接把這兩個字符去掉再比較,或者當s不爲空,且第一個字符和p的第一個字符相同時,再對去掉首字符的s和p調用遞歸,注意p不能去掉首字符,因爲*號前面的字符可以有無限個;如果第二個字符不爲*號,那麼就老老實實的比較第一個字符,然後對後面的字符串調用遞歸
class Solution {
public:
bool isMatch(string s, string p) {
if (p.empty()) return s.empty();
if (p.size() > 1 && p[1] == '*') {
return isMatch(s, p.substr(2)) || (!s.empty() && (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p));
} else {
return !s.empty() && (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p.substr(1));
}
}
};