给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
class Solution {
public boolean isSubsequence(String s, String t) {
int n = s.length();
int m = t.length();
int i = 0;
int j = 0;
while(i<n && j<m){
if(s.charAt(i) == t.charAt(j)){
i++;
}
j++;
}
return i==n;
}
}
知道了如何判断子序列,那么我们就可以做 力扣1898. 可移除字符的最大数目 这道题
给你两个字符串 s 和 p ,其中 p 是 s 的一个 子序列 。同时,给你一个元素 互不相同 且下标 从 0 开始 计数的整数数组 removable ,该数组是 s 中下标的一个子集(s 的下标也 从 0 开始 计数)。
请你找出一个整数 k(0 <= k <= removable.length),选出 removable 中的 前 k 个下标,然后从 s 中移除这些下标对应的 k 个字符。整数 k 需满足:在执行完上述步骤后, p 仍然是 s 的一个 子序列 。更正式的解释是,对于每个 0 <= i < k ,先标记出位于 s[removable[i]] 的字符,接着移除所有标记过的字符,然后检查 p 是否仍然是 s 的一个子序列。
返回你可以找出的 最大 k ,满足在移除字符后 p 仍然是 s 的一个子序列。
class Solution {
public int maximumRemovals(String s, String p, int[] removable) {
int len = removable.length;
int l = 0,r = len;
while(l < r){
int mid = (l+r+1)/2;
if(check(mid,removable,s,p)){
l = mid;
}else{
r = mid-1;
}
}
return l;
}
public boolean check(int mid,int[] removable,String s,String p){
int n = s.length();
int m = p.length();
boolean[] ch = new boolean[n];
for(int k = 0;k<mid;k++){
ch[removable[k]] = true;
}
int i = 0;
int j = 0;
while(i < m && j < n){
if(p.charAt(i) == s.charAt(j) && ch[j] == false){
i++;
}
j++;
}
return i == m;
}
}