LeetCode 392 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,”ace”是”abcde”的一个子序列,而”aec”不是)。
进阶:
如果有大量输入的 S ,称作 S1, S2, ... , Sk 其中 k >= 10亿 ,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
示例:
输入:s = “abc”, t = “ahbgdc”
输出:true
双指针法
使用两个指针 i,j 分别指向串 s 和串 t ,s[i]==t[j],i++,j++ 否则 j++ 当 i=s.size() 时,说明是子序列,否则移动到 j=t.size() 结束。
代码实现:
1 | class Solution { |
动态规划
此处使用动态规划主要是处理进阶问题,当有多个子序列 s 需要进行判断时,那么就需要使用一个动态规划数组做相应的记录处理。(本题并不适合使用动规进行求解,但确实可以套用相应的思想)
- 动态规划数组的定义:定义动态规划数组
dp[i][j]表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。 - 动态规划数组的推导:(本质思想还是和双指针的求解方式相同)对于
s[i-1]==t[j-1]说明此时相同子序列的长度可以加一,dp[i][j]=dp[i-1][j-1]+1。当s[i-1]!=t[j-1]时,子序列的长度不能增加,那么dp[i][j] = dp[i][j-1] - 动态规划数组的初始化:将第一行第一列初始化为0即可,因为初始时不存在元素。
- 动态规划数组的遍历顺序:逐行遍历,从前向后
代码实现:
1 | class Solution { |