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)