持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
今天是国庆的第一天,学习上怠慢了,没有系统的学到什么
判断子序列
该题出自力扣的392题 —— 判断子序列【中等题】
审题
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。 进阶: 如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
- 这道题题目和之前也很类似,就是判断其中一个字符串是否为另一个字符串的子串,但是子串,不代表一定需要连着出现,只需要按照特定的顺序出现即可
- 按照题意,首先判断最佳情况,字符串t直接包含字符串s,那么先用contains方法判断
- 记录上一次插入的下标变量a
- 循环字符串s,每一次都从下标变量a处开始截取字符串t,并且判断从a开始的字符串t是否包含着字符串s的当前下标
- 除了上述的方法外,也可以使用双指针的方法,当我们从前往后匹配,可以发现每次贪心地匹配靠前的字符是最优决策。我们初始化两个指针 i 和 j,分别指向 s 和 t 的初始位置。并且遍历字符串,最终得出结果
编码
class Solution {
public boolean isSubsequence(String s, String t) {
if (t.contains(s))return true;
//记录上一次插入的下标
int a = 0;
for (int i = 0; i < s.length(); i++) {
int i1 = t.indexOf(String.valueOf(s.charAt(i)),a);
if (i1 != -1 && i1 >= a){
a = i1 + 1;
continue;
}else {
return false;
}
}
return true;
}
}