【LeetCode】第392题——判断子序列(难度:简单)
作者:互联网
【LeetCode】第392题——判断子序列(难度:简单)
题目描述
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
-
示例 1:
输入:s = “abc”, t = “ahbgdc”
输出:true -
示例 2:
输入:s = “axc”, t = “ahbgdc”
输出:false
提示
0 <= s.length <= 100
0 <= t.length <= 104
两个字符串都只由小写字符组成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/is-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
双指针,p是s的指针,q是t的指针,若指向相同的元素则p、q均向后移动,若指向不同的元素,则只有q向后移动,直至s或t遍历到了对应字符串的末尾为止。
代码详解
class Solution {
public boolean isSubsequence(String s, String t) {
// 先排除两种特殊情况
if(s.length() == 0) {
return true;
} else if(t.length() == 0) {
return false;
}
// s和t的指针p与q
int p = 0;
int q = 0;
while(p < s.length() && q < t.length()) {
if(s.charAt(p) == t.charAt(q)) { // 指向内容一致则双指针均向后移动
++p;
++q;
if(p == s.length()) { // 若p在移动前就已遍历至s的末尾,则可以直接返回true
return true;
}
} else {
++q; // 指向内容不一致则只有q向后移动
}
}
return false; // 返回true的条件只有循环中的那个if这一个,因此运行至此处的s和t肯定返回false
}
}
注意点
-
若有一个t,但有无穷多个s来进行判断,会有大量的时间消耗在字符串t的指针移动上,因此可以考虑动态规划的思路来完成进阶的题解。
就是对t的二维描述,如对 t = “abea” 来说,当遍历至第0个字符a时,某 int[26] 数组应当存储的是 int[0] = 3、int[1] = 1、int[4] = 2,其余位置均为 -1。大家可能看不太懂,其实就是当前字符a的下一个a的位置是3,字符a的下一个b的位置是1,字符a的下一个e的位置是2,其它字母均不在当前a之后,因此均为-1。换句话说就是用int[26]存储下一个a-z字母所在的位置,多个int[26]构成二维数组,实现多个s对单个t的的跳跃式查询。
标签:字符,int,392,length,字符串,序列,true,LeetCode,指针 来源: https://blog.csdn.net/qq_43536930/article/details/112585750