lintcode: Distinct Subsequences
来源:互联网 发布:百度云vip账号淘宝 编辑:程序博客网 时间:2024/05/04 12:05
Given a string S and a string T, count the number of distinct subsequences of T in S.
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, “ACE” is a subsequence of “ABCDE” while “AEC” is not).
DP,化归为二维地图的走法问题。
r a b b i t
1 0 0 0 0 0 0
r 1
a 1
b 1
b 1
b 1
i 1
t 1
设矩阵transArray,其中元素transArray[i][j]为S[0,…,i] (这里指的是前0到i个字母)到T[0,…,j]有多少种转换方式。
问题就转为从左上角只能走对角(匹配)或者往下(删除字符),到右下角一共有多少种走法。
transArray[i][0]初始化为1的含义是:任何长度的S,如果转换为空串,那就只有删除全部字符这1种方式。
当S[i-1]==T[j-1],说明可以从transArray[i-1][j-1]走对角到达transArray[i][j](S[i-1]匹配T[j-1]),此外还可以从transArray[i-1][j]往下到达transArray[i][j](删除S[i-1])
参考http://www.cnblogs.com/ganganloveu/p/3836519.html
class Solution {public: /** * @param S, T: Two string. * @return: Count the number of distinct subsequences */ int numDistinct(string &S, string &T) { // write your code here int lenS=S.size(); int lenT=T.size(); vector<vector<int> >num(lenS+1,vector<int>(lenT+1,0)); for(int i=0;i<=lenS;i++){ num[i][0]=1; } for(int i=1;i<=lenS;i++){ for(int j=1;j<=lenT;j++){ if(S[i-1]==T[j-1]){ num[i][j]=num[i-1][j-1]+num[i-1][j]; }else{ num[i][j]=num[i-1][j]; } } } return num[lenS][lenT]; }};
一维数组即可
class Solution {public: /** * @param S, T: Two string. * @return: Count the number of distinct subsequences */ int numDistinct(string &S, string &T) { // write your code here int lenS=S.size(); int lenT=T.size(); //vector<vector<int> >num(lenS+1,vector<int>(lenT+1,0)); vector<int> num(lenT+1,0); num[0]=1; /* for(int i=0;i<=lenS;i++){ num[i][0]=1; } */ for(int i=1;i<=lenS;i++){ /*注意这里保存上一层的值*/ vector<int> oldNum(num); for(int j=1;j<=lenT;j++){ if(S[i-1]==T[j-1]){ num[j]=oldNum[j-1]+oldNum[j]; } } } return num[lenT]; }};
- lintcode:Distinct Subsequences
- lintcode: Distinct Subsequences
- **[Lintcode]Distinct Subsequences
- Distinct Subsequences--lintcode
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- Distinct Subsequences
- cpptest 的安装和破解
- 堆和栈的区别是啥?
- eclipse之web开发【servlet】
- c++指针详解
- flex学习进度4
- lintcode: Distinct Subsequences
- 堆和栈的区别(转过无数次的文章)
- Masonry的使用(二)
- 数组排序
- c++迭代器Iterator详解
- hadoop启动没有nodemanager
- BIEE12C-WIN环境备份
- c++标准模板库_顺序结构_Vectors详解
- Java的内存机制