动态规划
class Solution {
public boolean isSubsequence(String s, String t) {
/**
* 和《1143. 最长公共子序列》一样
*/
int[][] dp = new int[s.length() + 1][t.length() + 1];
for (int i = 1; i < s.length() + 1; i++) {
for (int j = 1; j < t.length() + 1; j++) {
if (s.charAt(i - 1) == t.charAt(j - 1)){
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else {
/**
* 唯一的区别是,当比较的字符不相等时,只考虑dp[i][j - 1],即删掉当前的t[j - 1]的情况
* 因为s所有字符都需要出现在t中,不能删
*/
dp[i][j] = dp[i][j - 1];
}
}
}
return dp[s.length()][t.length()] == s.length();
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
双指针
class Solution {
public boolean isSubsequence(String s, String t) {
if (s.length() > t.length()){
return false;
}
/**
* 双指针遍历字符串,如果t遍历完了s还没有,就说明找不到
*/
int left = 0;
int right = 0;
while (left < s.length()){
if (s.charAt(left) == t.charAt(right)){
left++;
right++;
}
else {
right++;
}
if (right == t.length() && left != s.length()){
return false;
}
}
return true;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/is-subsequence/