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若为空,则直接输出trueif (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)
做完了?试试挑战下一道!
LeetCode150道面试经典题--赎金信(简单)_Alphamilk的博客-CSDN博客