题目:

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).

Here is an example:
S = "rabbbit", T = "rabbit"

Return 3.

代码:

class Solution {
public:
int numDistinct(string s, string t) {
const int len_s = s.size();
const int len_t = t.size();
if ( len_s<len_t ) return ;
if ( len_s==len_t ) return s==t;
vector<vector<int> > dp(len_t+,vector<int>(len_s+,));
// initialization
dp[][] = ;
for ( int i=; i<=len_s; ++i ) dp[][i] = ;
// dp process
for ( int i=; i<=len_t; ++i )
{
for ( int j=; j<=len_s; ++j )
{
if ( t[i-]!=s[j-] )
{
dp[i][j] = dp[i][j-];
}
else
{
dp[i][j] = dp[i][j-] + dp[i-][j-];
}
}
}
return dp[len_t][len_s];
}
};

tips:

这个题目第一次想到的办法是递归:统计一共要删除多少个字符;每层递归删除一个字符;扫描所有情况。 这种递归的解法大集合肯定会超时。

憋了一会儿dp的解法,这次又把问题想简单了。

这种字符串比较的题目,涉及到记忆化搜索的,可以用二维dp来做。

dp[i][j] 表示T[0:i-1]与S[0:j-1]的匹配次数。

1. 初始化过程,dp[0][i]代表T为空字符,则S若要匹配上T只有把所有字符都删除了一种情况。

2. 状态转移方程:dp[i][j]如何求解?

 这里的讨论点其实很直观,即S[j-1]这个元素到底是不是必须删除。

  a) 如果T[i-1]!=S[j-1],则S[j-1]必须得删除(因为这是最后一个元素,不删肯定对不上T[i-1]); 因此 dp[i][j] = dp[i][j-1],跟S少用一个字符匹配的情况是一样的。

  b) 如果T[i-1]==S[j-1],则S[j-1]可删可不删;因此dp[i][j] = dp[i][j-1] + dp[i-1][j-1]:

    “dp[i][j-1]”是把S[j-1]删了的情况;“dp[i-1][j-1]”是不删除S[j-1]的情况,即用S[j-1]匹配上T[i-1]

按照上述的分析过程,可以写出来DP过程。完毕。

===========================================

第二次过这道题,没想出来思路,照着之前的思路写的。

class Solution {
public:
int numDistinct(string s, string t) {
int dp[s.size()+][t.size()+];
fill_n(&dp[][], (s.size()+)*(t.size()+), );
dp[][] = ;
for ( int i=; i<=s.size(); ++i ) dp[i][] = ;
// dp process
for ( int i=; i<=s.size(); ++i )
{
for ( int j=; j<=t.size(); ++j )
{
if ( s[i-]==t[j-] )
{
dp[i][j] = dp[i-][j-] + dp[i-][j];
}
else
{
dp[i][j] = dp[i-][j];
}
}
}
return dp[s.size()][t.size()];
}
};

【Distinct Subsequences】cpp的更多相关文章

  1. hdu 4739【位运算】.cpp

    题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...

  2. Hdu 4734 【数位DP】.cpp

    题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...

  3. 【N-Quens II】cpp

    题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...

  4. 【Climbing Stairs】cpp

    题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...

  5. 【Valid Sudoku】cpp

    题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  6. 【Permutations II】cpp

    题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...

  7. 【Subsets II】cpp

    题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...

  8. 【Sort Colors】cpp

    题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...

  9. 【Sort List】cpp

    题目: Sort a linked list in O(n log n) time using constant space complexity. 代码: /** * Definition for ...

随机推荐

  1. [WPF][ListBox]鼠标拖拽多选,(Shift Key、Ctrl Key多选有效)(转)

    <ListBox Name="listBox" SelectionMode="Extended"> <ListBox.Resources> ...

  2. JavaScript_HTML DEMO_2_事件

    如需在用户点击某个元素时执行代码,请向一个HTML事件属性添加JavaScript代码  OnClick=JavaScriptcript 对事件做出反应 HTML事件属性 使用HTML DOM来分配事 ...

  3. hihoCoder hiho一下 第二周 #1014 : Trie树(Trie树基本应用)

    思路: 完全看题目中的介绍就行了.还有里面的input写道:不保证是英文单词,也有可能是火星文单词哦.比赛结束后的提交是不用考虑26个字母之外的,都会AC,如果考虑128种可能的话,爆了内存.步骤就是 ...

  4. C++ vector容器类型的用法及注意

    转自http://www.cnblogs.com/charley_yang/archive/2010/12/11/1903040.html vector类为内置数组提供了一种替代表示,与string类 ...

  5. 302和VS启动后网站拒绝访问的解决方案

    网页状态302代表的是重定向的意思,就是网页跳转的一种状态 网站拒绝访问的时候可以在输出窗口查看是否有内容输出,如果没有说明启动网站的端口可能被占用,在网站项目——属性——web——项目中把地址的端口 ...

  6. POJ 3046 Ant Counting(递推,和号优化)

    计数类的问题,要求不重复,把每种物品单独考虑. 将和号递推可以把转移优化O(1). f[i = 第i种物品][j = 总数量为j] = 方案数 f[i][j] = sigma{f[i-1][j-k], ...

  7. Android(java)学习笔记152:采用get请求提交数据到服务器(qq登录案例)

    1.GET请求:    组拼url的路径,把提交的数据拼装url的后面,提交给服务器. 缺点:(1)安全性(Android下提交数据组拼隐藏在代码中,不存在安全问题)  (2)长度有限不能超过4K(h ...

  8. 2018.7.2 如何用js实现点击图片切换为另一图片,再次点击恢复到原图片

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. 2018.6.13 Java语言基础复习总结

    Java语言基础与面向对象编程实践 第一章 初识Java 1.1机器语言 机器语言是指一台计算机全部的指令集合.机器语言室友0和1组成的二进制数,是一串串由0和1组成的指令序列,可将这些指令序列交给计 ...

  10. Drupal的入门学习

    1. 注意content中的区别 Article和Basic page的区别 a.输入字段不一样,Article内容多了两个字段:tag和图片. b.内容的默认设置不一样,Article默认允许评论, ...