三種狀況:spa
「a」 對應"a",code
"." 對應 "a"blog
"a*" 對應 「aa」字符串
當p爲空,s爲空時能夠匹配;string
若p的第二個字符爲*,第一狀況爲不匹配(b, a*b);從 (b,b)開始匹配io
第二種狀況爲匹配(a, a*); 首元素相同, 從( ,a*)開始匹配ast
若p的第二個字符不爲*, 首字符必需要匹配, 再對首字符後的字符串匹配class
recursive solution:im
class Solution { public: bool isMatch(string s, string p) { if(p.empty()) return s.empty(); // if(s.empty()) return p.empty(); if(p[1]=='*') { return (isMatch(s,p.substr(2))||((p[0]==s[0]||p[0]=='.')&&!s.empty()&&isMatch(s.substr(1),p))); // if(p[0]==s[0]||p[0]=='.'&&!s.empty()) // return isMatch(s.substr(1),p); // else // return isMatch(s,p.substr(2)); } else { if(p[0]==s[0]||p[0]=='.'&&!s.empty()) return isMatch(s.substr(1),p.substr(1)); else return false; //return (p[0]==s[0]||p[0]=='.')&&!s.empty()&&isMatch(s.substr(1),p.substr(1)); } } };
DP solution:img
定義若是 dp[i+1][j+1]匹配,當s[0-i]與p[0-j]匹配。
若是 p[j]!='*', dp[i][j]=dp[i-1][j-1] && s[i-1]==p[j-1];
若是p[j]=='*', dp[i][j]==dp[i][j-2], 0times repeat
dp[i][j]==dp[i-1][j]&& (s[i - 1] == p[j - 2] || p[j - 2] == '.')the pattern repeats for at least 1 times.