马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
差别的子序列
给定一个字符串 s 和一个字符串 t ,盘算在 s 的子序列中 t 出现的个数。、
编辑间隔中的删除元素,实在就是直接变数字,其只删除原来的较长的数组里的元素

递推模拟,利用s的末了一个元素匹配,大概删除末了一个元素看前面一个是否匹配

初始化,dp[0]=1体现s不为空,t为空,如许把s删到空就肯定有一个,同理dp[0]=0,重叠部门dp[0][0]就即是空字符串匹配空字符串,为1
界说为int,出现了超时错误
以是可以用longlongint 的别名 uint64_t- class Solution {
- public:
- int numDistinct(string s, string t) {
- vector<vector<uint64_t>> dp(s.size()+1,vector<uint64_t>(t.size()+1));
- for(int i=0;i<s.size();i++) dp[i][0]=1;
- for(int j=1;j<t.size();j++) dp[0][j]=0;
- for(int i=1;i<=s.size();i++){
- for(int j=1;j<=t.size();j++){
- if(s[i-1]==t[j-1]){
- dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
- }
- else{
- dp[i][j]=dp[i-1][j];
- }
- }
- }
- return dp[s.size()][t.size()];
- }
- };
复制代码 两个字符串的删除利用
实在就是两个字符串都可以删除了
递推公式如下
- class Solution {
- public:
- int minDistance(string word1, string word2) {
- vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
- for(int i=0;i<=word1.size();i++) dp[i][0]=i;
- for(int j=0;j<=word2.size();j++) dp[0][j]=j;
- for(int i=1;i<=word1.size();i++){
- for(int j=1;j<=word2.size();j++){
- if(word1[i-1]==word2[j-1]) dp[i][j]=dp[i-1][j-1];
- else dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);
- }
- }
- return dp[word1.size()][word2.size()];
- }
- };
复制代码 思绪二是,先求出公共子序列的长度,再用两个字符串的总长度减去公共子序列的长度- class Solution {
- public:
- int minDistance(string word1, string word2) {
- vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1, 0));
- for (int i=1; i<=word1.size(); i++){
- for (int j=1; j<=word2.size(); j++){
- if (word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
- else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
- }
- }
- return word1.size()+word2.size()-dp[word1.size()][word2.size()]*2;
- }
- };
复制代码 编辑间隔(动规经典标题)
=为什么这道题不能接纳上一题的思绪二,先求出公共子序列的长度,再用两个字符串的总长度减去公共子序列的长度,由于很大概长度一样,但可以只更换一次就完成,但思绪2会要求按着序次删除
|