115. 不同的子序列
动态规划
class Solution {
public int numDistinct(String s, String t) {
/**
* 结合《1143. 最长公共子序列》和《392. 判断子序列》
* dp[i][j]定义为以s[i - 1]结尾的字符串s中出现以t[j - 1]结尾的字符串t的个数
* 如果t长度为0,则肯定出现在s中,初始化为1
*/
int[][] dp = new int[s.length() + 1][t.length() + 1];
for (int i = 0; i <= s.length(); i++) {
dp[i][0] = 1;
}
for (int i = 1; i <= s.length(); i++) {
for (int j = 1; j <= t.length(); j++) {
/**
* 如果s.charAt(i) == t.charAt(j),说明匹配成功,t是用t[j - 1]来匹配的,但s却分为两种情况
* 1、s是用s[i - 1]来匹配的,因此个数等于dp[i - 1][j - 1](注意此处求的是个数而不是长度,所以不用加1)
* 2、s使用s[i - 2]来匹配的,因为可能s[i - 2] == s[i - 1],等价于删掉s[i - 1],此时个数等于dp[i - 1][j]
* 因此总的个数为二者之和
*/
if (s.charAt(i - 1) == t.charAt(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.length()][t.length()];
}
}
/**
* 时间复杂度 O(n^2)
* 空间复杂度 O(n^2)
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!