持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
力扣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
两个字符串都只由小写字符组成。
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
这部分可以写写:
-
这道题考察了什么思想?你的思路是什么?
我的思路很简单,因为我们要找的是s是不是t的子序列,只需要找到任何一种即可。我们同时遍历两个字符串,短的字符串指针为i,长的字符串指针为j。如果当i和j同时指到了同样的字母,就i和j同时右移。否则,只移动指针j。直到长的字符串遍历完毕,指针指到尾巴了。如果此时指针i的位置不是短字符串的长度,那么就s就不是t的子序列。如果指针i的位置与短字符串的长度相等,那么s就是t的子序列。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
是一次通过的,我的思路比较简单,只需要简单编写代码即可。下面来看看大佬们的解法吧!
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
这种题目居然也能用动态规范!
func isSubsequence(s string, t string) bool {
n, m := len(s), len(t)
f := make([][26]int, m + 1)
for i := 0; i < 26; i++ {
f[m][i] = m
}
for i := m - 1; i >= 0; i-- {
for j := 0; j < 26; j++ {
if t[i] == byte(j + 'a') {
f[i][j] = i
} else {
f[i][j] = f[i + 1][j]
}
}
}
add := 0
for i := 0; i < n; i++ {
if f[add][int(s[i] - 'a')] == m {
return false
}
add = f[add][int(s[i] - 'a')] + 1
}
return true
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/is-subsequence/solution/pan-duan-zi-xu-lie-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
class Solution {
public:
bool isSubsequence(string s, string t) {
int i = 0, j = 0;
while (i < s.length() && j < t.length()) {
if (s[i] == t[j]) {
i++;
j++;
}
else j++;
}
if (i == s.length())return true;
else return false;
}
};
四、总结:
如果你还有更多的思考、分析、总结,通通都加上来吧~
392. 判断子序列
这道题目用动态规范真的十分有趣,动态规划果然强大如斯!这里是小伞,欢迎每天来看看小伞的题解,和小伞一起进步哦!
写作模板来源:
作者:掘金酱 链接:juejin.cn/post/706970…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。