1.题目
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
2.示例
编辑
3.思路
双指针:
设置两个指针,一个T指针指向T并且遍历t,另一个有效位指针Sindex指向s初始位置,当数组中两者值相等时候S指针下移一位,当有效位指针一旦到达s字符串长度则返回true,否则返回false
4.代码
LeetCode代码:
class Solution { public boolean isSubsequence(String s, String t) { int sIndex = 0; if(s.length() == 0){ return true; } for (int i=0;i<t.length();i++){ if (s.charAt(sIndex)==t.charAt(i)){ sIndex++; if(sIndex == s.length()){ return true; } } } return false; } }
编辑
案例详细代码:
package LeetCode11; public class javaDemo { public static void main(String[] args) { String s = "a"; String t = "ahbgdc"; boolean flag = false; // S字符串有效位指针 int sIndex = 0; // 判断是否为特殊情况即s若为空,则直接输出true if (s.equals("")){ System.out.println(true); }else { // 不是特殊情况则进行双指针判断 for (int i=0;i<t.length();i++){ // 判断是否值相等 if (s.charAt(sIndex)==t.charAt(i)){ sIndex++; // 如果sIndex遍历完,也就意味着存在子序列输出flag并即使跳出防止越界 if (sIndex == s.length()){ flag = true; break; } } } } System.out.println(flag); } }
时间复杂度为O(n),空间复杂度为O(1)





