代码随想录算法训练营第五十四天 | 115.不同的子序列,392.判断子序列
已解答
简单
相关标签
相关企业
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"
是"abcde"
的一个子序列,而"aec"
不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
致谢:
特别感谢 @pbrother 添加此问题并且创建所有测试用例。
示例 1:
输入:s = "abc", t = "ahbgdc"
输出:true
示例 2:
输入:s = "axc", t = "ahbgdc"
输出:false
提示:
0 <= s.length <= 100
0 <= t.length <= 10^4
- 两个字符串都只由小写字符组成。
package main
func isSubsequence(s string, t string) bool {
// dp[i][j] s的i t的j 这两位置 是否是子序列
// 递推公式, s[i] == t[j] dp[i][j] = dp[i-1][j-1] else dp[i][j] = dp[i][j-1]
// 初始化 dp[0] 0行 全为1
// 从1到end
// 输出
dp := make([][]bool, len(s)+1)
fori := 0; i < len(dp); i++ {
dp[i] = make([]bool, len(t)+1)
}
fori := 0; i < len(t)+1; i++ {
dp[0][i] = true
}
fori := 1; i < len(s)+1; i++ {
forj := 1; j < len(t)+1; j++ {
if s[i-1] == t[j-1] {
dp[i][j] = dp[i-1][j-1]
} else {
dp[i][j] = dp[i][j-1]
}
}
}
return dp[len(s)][len(t)]
}
已解答
困难
相关标签
相关企业
给你两个字符串 s
和 t
,统计并返回在 s
的 子序列 中 t
出现的个数,结果需要对 109 + 7 取模。
示例 1:
输入:
输出
:
3
解释:
"rabbit" 的方案
rabbbit
rabbbit
rabbbit
示例 2:
输入:
输出
:
5
解释:
"bag" 的方案
babgbag
babgbag
babgbag
babgbag
babgbag
提示:
1 <= s.length, t.length <= 1000
s
和t
由英文字母组成
package main
func numDistinct(s string, t string) int {
//dp[i][j] s的i t的j 不同子序列 这个位置的子序列个数
//递推公式 s[i] = t[j] dp[i][j] = dp[i-1][j-1]+dp[i][j-1] else dp[i][j] = dp[i][j-1]
//初始化 0行为为1
//上到下,左到右
//输出
mod := 1000000007
dp := make([][]int, len(t)+1)
fori := 0; i < len(dp); i++ {
dp[i] = make([]int, len(s)+1)
}
fori := 0; i < len(s)+1; i++ {
dp[0][i] = 1
}
fori := 1; i < len(t)+1; i++ {
forj := 1; j < len(s)+1; j++ {
if t[i-1] == s[j-1] {
dp[i][j] = (dp[i-1][j-1] + dp[i][j-1]) % mod
} else {
dp[i][j] = (dp[i][j-1]) % mod
}
}
}
return dp[len(t)][len(s)]
}
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现