文章目录
1.题目
- 题目要求,「手画图解」动态规划,需要仔细的分情况讨论
- eg:
示例 2:
输入:s = "aa" p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。
因此,字符串 "aa" 可被视为 'a' 重复了一次。
- 思路:不使用DP
星号匹配到s串中的位置,使用 iStart 来表示;
p串中星号的位置很重要,用 jStar 来表示;
再用两个变量i和j分别指向当前s串和p串中遍历到的位置; - 思路:使用DP
2.代码
非DP写法,不能full ac
class Solution {
public:
bool isMatch(string s, string p)
{
int i=0,j=0,istar=-1,jstar=-1,s_size=s.size(),p_size=p.size();
while (i<s_size)
{
if (j<p_size && (s[i] == p[j] || p[j] == '.'))
i++,j++;
else if (j<p_size && p[j] == '*')
istar=i,jstar=j++;
else if (istar>=0)
i=++istar,j=jstart+1;
else
return false;
}
//没匹配完的p串里只能剩星号,不能有其他的字符,将连续的星号过滤掉
while (j<p_size && p[j] == '*') j++;
return j==p_size;
}
};
DP写法