算法小知识-----10.01----- 判断子序列

83 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }
}

image.png