
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
示例 1:
输入:s = "abc", t = "ahbgdc"
输出:true
示例 2:
输入:s = "axc", t = "ahbgdc"
输出:false
提示:
0 <= s.length <= 100
0 <= t.length <= 10^4
两个字符串都只由小写字符组成。
暴力解法
双层循环判断是否是子序列。
// 每次比对短字符串中的字符的时候 长字符串的起始下标
int index = 0;
// 长字符串中包含短字符串中的字符数
int num = 0;
for (int i = 0; i < s.length(); i++) {
for (int j = index; j < t.length(); j++) {
// 如果字符相等,下一次长字符串的起始下标改变
// 长字符串中包含短字符串中的字符数+1
if(t.charAt(j)==s.charAt(i)){
index = j+1;
num++;
break;
}
}
}
// 如果长字符串包含短字符串中的字符数正好等于短字符串长度一样即为子序列
return num==s.length();
优化解法一
既然会多次比对字符,并且多次遍历长字符串,那么考虑使用双指针,同时遍历对比。
// 双指针初始化
int indexS = 0, indexT = 0;
while (indexS < s.length() && indexT < t.length()) {
// 如果字符相等,短字符串的指针+1
if (s.charAt(indexS) == t.charAt(indexT)) {
indexS++;
}
// 长字符串指针+1
indexT++;
}
// 比对短字符串的indexS是否等于短字符串的长度
return indexS == s.length() ? true : false;
852

被折叠的 条评论
为什么被折叠?



