力扣115. 不同的子序列(字符串+动态规划)
https://leetcode-cn.com/problems/distinct-subsequences/
字符串+动态规划
从左往右匹配
class Solutionfront {
public:
int numDistinct(string s, string t) {
int m = s.size();
int n = t.size();
if (m < n)
{
return 0;
}
vector<vector<long>>dp((m + 1), vector<long>((n + 1), 0));
for (int i = 0; i < m + 1; i++)
{
dp[i][0] = 1;
}
for (int i = 0; i < m + 1; i++)
{
for (int j = 0; j < n + 1; j++)
{
cout << dp[i][j] << " ";
}
cout << endl;
}
cout << endl;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; 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];
}
}
}
for (int i = 0; i < m + 1; i++)
{
for (int j = 0; j < n + 1; j++)
{
cout << dp[i][j] << " ";
}
cout << endl;
}
return dp[m][n];
}
};
从右往左匹配
class Solutionback {
public:
int numDistinct(string s, string t) {
int m = s.size();
int n = t.size();
if (m < n)
{
return 0;
}
vector<vector<long>>dp((m + 1), vector<long>((n + 1), 0));
//initial
for (int i = 0; i < m + 1; i++)
{
dp[i][n] = 1;
}
for (int i = m - 1; i >= 0; i--)
{
for (int j = n - 1; j >= 0; j--)
{
if (s[i] == t[j])
{
dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j];
}
else
{
dp[i][j] = dp[i + 1][j];
}
}
}
for (int i = 0; i < m + 1; i++)
{
for (int j = 0; j < n + 1; j++)
{
cout << dp[i][j] << " ";
}
cout << endl;
}
return dp[0][0];
}
};
汇总
// 115numDistinct.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<string.h>
#include<vector>
using namespace std;
//从前往后
class Solutionfront {
public:
int numDistinct(string s, string t) {
int m = s.size();
int n = t.size();
if (m < n)
{
return 0;
}
vector<vector<long>>dp((m + 1), vector<long>((n + 1), 0));
for (int i = 0; i < m + 1; i++)
{
dp[i][0] = 1;
}
for (int i = 0; i < m + 1; i++)
{
for (int j = 0; j < n + 1; j++)
{
cout << dp[i][j] << " ";
}
cout << endl;
}
cout << endl;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; 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];
}
}
}
for (int i = 0; i < m + 1; i++)
{
for (int j = 0; j < n + 1; j++)
{
cout << dp[i][j] << " ";
}
cout << endl;
}
return dp[m][n];
}
};
//从后往前
class Solutionback {
public:
int numDistinct(string s, string t) {
int m = s.size();
int n = t.size();
if (m < n)
{
return 0;
}
vector<vector<long>>dp((m + 1), vector<long>((n + 1), 0));
//initial
for (int i = 0; i < m + 1; i++)
{
dp[i][n] = 1;
}
for (int i = m - 1; i >= 0; i--)
{
for (int j = n - 1; j >= 0; j--)
{
if (s[i] == t[j])
{
dp[i][j] = dp[i + 1][j + 1] + dp[i + 1][j];
}
else
{
dp[i][j] = dp[i + 1][j];
}
}
}
for (int i = 0; i < m + 1; i++)
{
for (int j = 0; j < n + 1; j++)
{
cout << dp[i][j] << " ";
}
cout << endl;
}
return dp[0][0];
}
};
int main()
{
Solution solu;
string s = "babgbag";
string t = "bag";
cout << solu.numDistinct(s, t);
cout << endl;
std::cout << "Hello World!\n";
}