引言
由 “LSGO软件技术团队” 组织的 “基础算法刻意练习” 采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。以下是我的每日打卡记录:
Task26.判断子序列
-
Leetcode第392题
-
难度:简单
-
题目概述:
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变 剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序 列,而"aec"不是)。 示例 1: s = "abc", t = "ahbgdc" 返回 true. 示例 2: s = "axc", t = "ahbgdc" 返回 false. 后续挑战 : 如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要 依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
题解思路
要比较两个字符串,则一个指针指向 s,一个指针指向 t,如果匹配,两指针向后移动;不匹配,则只移动 t 指针。直到一方遍历完成
时间复杂度:O(m+n)
class Solution {
public boolean isSubsequence(String s, String t) {
int ps=0;
int pt=0;
while(ps<s.length() && pt<t.length())
if(s.charAt(ps)==t.charAt(pt)){
ps++;
pt++;
}
else
pt++;
return ps==s.length();
}
}
提交记录
String 类中的 indexof(char c,int index) 方法能够从指定的索引 index 开始搜索,并返回指定字符第一次出现的索引,如果没找到返回 -1。利用这个方法,依次搜索字符串 s 中包含的字符,如果没找到则返回 false。
时间复杂度:O(n)
class Solution {
public boolean isSubsequence(String s, String t) {
char[] arr = s.toCharArray();
int j = -1;
for(int i = 0;i<arr.length;i++) {
j = t.indexOf(arr[i],j+1);
if(j==-1)
return false;
}
return true;
}
}