【Distinct Subsequences】cpp
题目:
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的更多相关文章
- hdu 4739【位运算】.cpp
题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...
- 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~ ...
- 【N-Quens II】cpp
题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...
- 【Climbing Stairs】cpp
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- 【Valid Sudoku】cpp
题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...
- 【Permutations II】cpp
题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...
- 【Subsets II】cpp
题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...
- 【Sort Colors】cpp
题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...
- 【Sort List】cpp
题目: Sort a linked list in O(n log n) time using constant space complexity. 代码: /** * Definition for ...
随机推荐
- uvm_hdl——DPI在UVM中的实现(四)
我们可以在uvm中实现HDL的后门访问,具体包括的function有uvm_hdl_check_path,uvm_hdl_deposit, uvm_hdl_force,uvm_hdl_release, ...
- HDU 3351 Seinfeld 宋飞正传(水)
题意: 给出一个串,串内只有大括号,问经过几次改变可使全部括号合法?改变指的是可以将某一方向的括号变成另一方向. 思路: 利用栈的特点,若出现成对的合法括号,直接删掉,留下那些不合法的成为一串.既然不 ...
- IOS 拖拽事件(手势识别)
@interface NJViewController () @property (weak, nonatomic) IBOutlet UIView *customView; @end @implem ...
- UVA Live Archive 4394 String painter(区间dp)
区间dp,两个str一起考虑很难转移. 看了别人题解以后才知道是做两次dp. dp1.str1最坏情况下和str2完全不相同,相当于从空白串开始刷. 对于一个区间,有两种刷法,一起刷,或者分开来刷. ...
- 【BZOJ1029】[JSOI2007] 建筑抢修(堆优化贪心)
点此看题面 大致题意: 有N个受到严重损伤的建筑,对于每个建筑,修好它需要\(T1\)秒,且必须在\(T2\)秒之前修完(\(T1\)与\(T2\)不是固定值),问你最多能修好几个建筑. 题解 一看到 ...
- selective search生成.mat文件
https://github.com/sergeyk/selective_search_ijcv_with_python 里的selective_search.py是python接口 import t ...
- 踩坑日志!viser-ng的使用
在ng-alian项目中使用viser图表库,在app.module中引用了viser-ng,然而,在具体的html项目中使用<v-chart>会报错,提示v-chart不是一个angul ...
- C# File和Directory类
File和Directory类 作为实用类,File和Directory类都提供了许多方法,用于处理文件系统以及其中的文件和目录.这些是静态方法,涉及移动文件.查询和更新属性并创建FileStream ...
- Uva 长城守卫——1335 - Beijing Guards
二分查找+一定的技巧 #include<iostream> using namespace std; +; int n,r[maxn],Left[maxn],Right[maxn];//因 ...
- SpringMVC解决前台传入的数组或集合类型数据
1前台处理如下: $.ajax({ url:"saveMapInfo", type:"POST", dataType:"json", con ...