LeetCode 392. 判断子序列——Java(双指针)

给定字符串 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;
    }
}

你可能感兴趣的:(蓝桥杯,java,算法)