A DP problem. [解题方法] 此题需要使用大数运算。使用一点 DP 即可。关键是如何得到递推关系,可以这样想,设母串的长度为 j, 子串的长度为 i,我们要求的就是长度为 i 的字串在长度为 j 的母串中出现的次数,设为 t[i][j],若母串的最后一个字符与子串的最后一个字符不同,则长度为 i 的子串在长度为 j 的母串中出现的次数就是母串的前 j - 1 个字符中子串出现的次数,即 t[i][j] = t[i][j - 1],若母串的最后一个字符与子串的最后一个字符相同,那么除了前 j - 1 个字符出现字串的次数外,还要加上子串的前 i - 1 个字符在母串的前 j - 1 个字符中出现的次数,即 t[i][j] = t[i][j - 1] + t[i - 1][j - 1]。 也可以用二维数组,这里图省事,直接用滚动数组了。
Code如下:
1: int numDistinct(string S, string T) { 2: // Start typing your C/C++ solution below 3: // DO NOT write int main() function 4: int match[200]; 5: if(S.size() < T.size()) return 0; 6: match[0] = 1; 7: for(int i=1; i <= T.size(); i++) 8: match[i] = 0; 9: for(int i=1; i<= S.size(); i ++) 10: for(int j =T.size(); j>=1; j--) 11: if(S[i-1] == T[j-1]) 12: match[j]+= match[j-1]; 13: return match[T.size()]; 14: }已犯错误: 1. line 7, 应该是i<=T.size(), 因为把0作为边界使用了。 2. line 10, j应该从尾到头,因为每次要使用上一次loop的值。如果从头往尾扫的话,重复计算了。