前天wildcard matching没AC,今天接着搞,改用动态规划。题目再放一次:
'?'匹配任意字符,'*'匹配任意长度字符串
Some examples: isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → true isMatch("aab", "c*a*b") → false
表格的设计也比较直接,输入两个字符串s,p,假设长度为len_s和len_p,设置一张len_s*len_p的bool型表格PD,其中第i行第j列即PD[i][j]就代表isMatch(s[0...i-1], p[0,...,j-1])
观察一下规律不难得出
- 如果PD[i-1][j]==true或者PD[i][j-1]==true,并且s[i]=='*'或者p[j]=='*'时PD[i][j]==true;
- 如果PD[i-1][j-1]==true时,s[i]与p[j]匹配,则PD[i][j]==true。
代码就很容易搞定了。不过在讨论区看到不少人用DP,内存超出限制了,内存也比较好优化,因为从上面可以看到PD[i]只和PD[i-1]有关系,所以只需要保存上一行PD就可以了,这样空间复杂度基本是2*len_p。
还有要注意的是输入的字符串为空字符串的情况,代码如下:
class Solution { public: bool isMatch(const char *s, const char *p) { int len_s = strlen(s); int len_p = strlen(p); if (0==len_p*len_s) { if ('