leetcode dp 不同的子序列

O

问题

解决方案

代码

class Solution {
public:
   int numDistinct(string a, string b) {
   	int m = a.size();
   	int n = b.size();
   	vector<vector<unsigned long>>dp(m +1 , vector<unsigned long>(n+1,0));
   	for(int i = 0 ; i < m+1;i++){
   		dp[i][0] = 1;
   	}
   	for( int i = 1 ; i < m+1;i++){
   		for( int j = 1 ; j< n+1;j++){
   			dp[i][j] = dp[i-1][j];
   			if(a[i-1] == b[j-1]){dp[i][j] += dp[i-1][j-1]; }
   			

   		}
   	}
   	return dp[m][n];

   }
};



2


/*
* @lc app=leetcode.cn id=115 lang=cpp
* [115] 不同的子序列
* 状态: 字符串b在a中的子串数量。 
* dp方程: 如果a当前的字符等于b的字符,那么数量等于加上dp[i-1][j-1】de。 此外不管当前等于或者
* 不等于, 那么直接就加上dp【i-1】[j]之前的, 因为是数量类型, 所以直接求就行了, 不在乎其他的。
* 初始化: 这道题初始化有难度, 当a等于0 的时候肯定是0 , 当b= 0 的时候就有争议了, 为1还是0 呢, 这时候
* 我们举个用到b=0的例子发现设置为1 才合理。其实也符合场景。
* 边界问题: 不超越数组就行。 
*/
// @lc code=start
class Solution {
public:
   int numDistinct(string a, string b) {
   	int m = a.size();
   	int n = b.size();
   	vector<vector<unsigned long>>dp(m +1 , vector<unsigned long>(n+1,0));
   	for(int i = 0 ; i < m+1;i++){
   		dp[i][0] = 1;
   	}
   	for (int i = 1; i < m + 1; i++) {
   		for (int j = 1;  j < n + 1; j++) {
   			dp[i][j] = dp[i- 1][j]	;
   			if(a[i - 1] == b[j - 1]) {
   				dp[i][j] += dp[i - 1][j -1];
   			}
   		}
   	}
   	return dp[m][n];

   }
};
// @lc code=end



### LeetCode 最长公共子序列问题的解决方案 解决LeetCode上的最长公共子序列(LCS)问题通常采用动态规划方法。以下是详细的解答过程以及Python实现。 #### 动态规划的核心思路 定义一个二维数组 `dp`,其中 `dp[i][j]` 表示字符串 `text1[:i]` 和 `text2[:j]` 的最长公共子序列长度。状态转移方程可以表示为: - 如果 `text1[i-1] == text2[j-1]`,则有: \[ dp[i][j] = dp[i-1][j-1] + 1 \] - 否则,取两者中的最大值: \[ dp[i][j] = \max(dp[i-1][j], dp[i][j-1]) \] 初始条件为当任意一方为空串时,其公共子序列为零,即 `dp[0][j] = 0` 和 `dp[i][0] = 0` 对于所有的 \( i, j \geq 0 \)[^1]。 #### Python 实现代码 下面是基于上述逻辑的Python实现: ```python def longestCommonSubsequence(text1: str, text2: str) -> int: m, n = len(text1), len(text2) # 创建DP表并初始化 dp = [[0] * (n + 1) for _ in range(m + 1)] # 填充DP表 for i in range(1, m + 1): for j in range(1, n + 1): if text1[i - 1] == text2[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 dp[m][n] ``` 此函数接受两个字符串作为输入参数,并返回它们之间的最长公共子序列的长度[^3]。 #### 示例运行 考虑以下测试用例及其解释: - 输入 `text1 = "abcde"` 和 `text2 = "ace"`,输出应为 `3`,因为最长公共子序列是 `"ace"`[^2]。 - 当两字符串完全相同时,例如 `text1 = "abc"` 和 `text2 = "abc"`,结果亦为其长度 `3`。 - 若无任何共同字符存在,则如例子三所示,返回值应当为 `0`[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值