不同的子序列-LintCode
来源:互联网 发布:python创建临时文件夹 编辑:程序博客网 时间:2024/05/18 21:41
给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
样例:
给出S = “rabbbit”, T = “rabbit”
返回 3
思想:
dp[i][j]表示字符串S的前i个字符中,T的前j个字符出现的次数。
易得:
dp[i][0]=1,对于空串出现次数为1;
dp[0][j]=0,若S为空,则T中字符串出现次数为0(j!=0);
dp[i][j]=dp[i-1][j]+(S[i-1]==T[j-1]?dp[i-1][j-1]:0),假设S已经匹配了j - 1个字符,得到匹配个数为dp[i][j - 1]。目前匹配的个数至少是dp[i][j - 1]。如果S[i]==T[j],则当前这个字母为可选择项,所以变换方法等于保留这个字母的变换方法加上不用这个字母的变换方法。
#ifndef C118_H#define C118_H#include<iostream>#include<string>#include<vector>using namespace std;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 m = S.size(); int n = T.size(); vector<vector<int>> dp(m + 1, vector<int>(n + 1)); for (int i = 0; i <= m; ++i) dp[i][0] = 1; for (int j = 1; j <= n; ++j) dp[0][j] = 0; for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { dp[i][j] = dp[i - 1][j] + (S[i - 1] == T[j - 1] ? dp[i - 1][j - 1] : 0); } } return dp[m][n]; }};#endif
阅读全文
0 0
- LintCode-不同的子序列
- LintCode -- 不同的子序列
- LintCode 不同的子序列
- 不同的子序列-LintCode
- lintcode--不同的子序列
- lintcode之不同子序列数 + 序列II
- 不同的子序列
- 不同的子序列
- 不同的子序列
- 不同的子序列
- LintCode 带重复元素的子序列
- 题目:不同的子序列
- LintCode-乘积最大子序列
- lintcode-最长连续子序列
- LintCode -- 乘积最大子序列
- LintCode : 最长公共子序列
- lintcode- 乘积最大子序列
- LintCode:乘积最大子序列
- flask中设置和获取cookie
- 写博客
- java中的多线程实现方式
- java 动态绑定
- poj 2386 Lake counting
- 不同的子序列-LintCode
- Activity生命周期:onCreate onStart onResume onPause onStop onDestory (1) 启动Activity: onCreate onStart onR
- 文字块自动换行
- 【技术干货】阿里云构建千万级别架构演变之路
- 虚拟现实到底是什么?
- React学习(五)this.props.children
- 通过MFC将数据保存到Excel中
- opencv2413 gpu mog2_gpu CascadeClassifier_GPU
- 体育赛事视频直播方案