给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。 (例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是) 题目数据保证答案符合 32 位带符号整数范围。 数据范围: 0 <= s.length, t.length <= 1000 s 和 t 由英文字母组成
设s[1,n],t[1,m], 令d[i][j]表示s[1,i]中,能组成t串前j个字符的子序列数量, 一开始d[0][0]=1,转移方程: d[i][j]+=d[i-1][j], if(s[i]==t[j])d[i][j]+=d[i-1][j-1]. 第一维可以滚动优化掉. ps: 这题有个奇怪的地方就是,直接提交会在数据61/62处返回一个爆int错误, 然后我改成longlong就过了,真无语.
const int maxm=1e3+5; #define ll long long ll d[maxm]; class Solution { public: int numDistinct(string s, string t) { memset(d,0,sizeof d); int n=s.size(),m=t.size(); s.insert(s.begin(),'$'); t.insert(t.begin(),'#'); d[0]=1; for(int i=1;i<=n;i++){ for(int j=m;j>=1;j--){ if(s[i]==t[j]){ d[j]+=d[j-1]; } } } return (int)d[m]; } };