安徽网站建设公司排名公司建的站加油违法吗
安徽网站建设公司排名,公司建的站加油违法吗,wamp做网站,合肥seo建站题目链接#xff1a;1898. 可移除字符的最大数目#xff08;中等#xff09; 算法原理#xff1a; 此题的题意跟下面这题基本一模一样#x1f447;#xff0c;只不过之前的求最小#xff0c;这个是求最大 D.二分查找#xff0d;二分答案#xff0d;求最小——3639. 变…题目链接1898. 可移除字符的最大数目中等算法原理此题的题意跟下面这题基本一模一样只不过之前的求最小这个是求最大D.二分查找二分答案求最小——3639. 变为活跃状态的最小时间解法二分查找96ms击败40.00%时间复杂度O(Nlogn)①目标变量依次移除下标数②目标条件在保证p是否还是剩下子串的子序列的前提下尽量多移除下标③转换逻辑移除前mid个下标对应的字符后p是否还是剩下子串的子序列具体步骤①确定边界left0最少就是一个都不移除rightremovable.length最多就是把removable数组中的下标全移除②确定二分模型移除下标数↑ p是剩余子串的子序列的概率↓ 呈负相关单调由于是找最大移除下标数因此采用最右端点模型③check方法设计如果移除了mid个下标如果p还是剩下子串的子序列就返回truemid不动地方否则就是移除多了需要向左调整这里我们采用标记数组如果s数组中的字符被移除就标记为true遍历时从左向右依次检查如果未被移除且能和p中字符对应就相应指针往后挪继续检查当指针恰好把p走完说明还有p的这个子序列答疑Q1既然是一一对应检查我把s和p都存进顺序表检查不可以吗有的小伙伴写check方法时可能会想到用顺序表给s和p分别创建一个顺序表利用Java自带的ArrayList移除中间元素后后续元素会自动向前拼接的特性来判断s剩余字符串是否还存在子序列p相关代码放下面了但这有个致命错误那就是下标偏移错误举个例子假设原始 s abcde下标 0-4r [2, 3]要移除原始下标 2 和 3对应字符 c 和 d第一步tmp.remove(2) → tmp 变成 [a,b,d,e]原始 d 现在在 tmp 的下标 2 位置第二步tmp.remove(3) → 你想删原始下标 3 的 d但现在 tmp 的下标 3 是 e结果删成了 e完全错了Java代码class Solution { public int maximumRemovals(String s, String p, int[] r) { int left0,rightr.length; while(leftright){ int midleft(right-left1)/2; if(!check(mid,s,p,r)) rightmid-1; else leftmid; } return left; } //移除前mid个下标对应字符后子序列还有p就返回true private boolean check(int mid,String s, String p, int[] r){ int ns.length(); boolean[] removednew boolean[n]; for(int i0;imid;i) removed[r[i]]true; int pindex0; for(int i0;inpindexp.length();i) if(!removed[i]s.charAt(i)p.charAt(pindex)) pindex; return pindexp.length(); } }class Solution { //错误的示范代码 private static ListCharacter listpnew ArrayList(); private static ListCharacter listsnew ArrayList(); public int maximumRemovals(String s, String p, int[] r) { for(char c:p.toCharArray()) listp.add(c); for(char c:s.toCharArray()) lists.add(c); int left0,rightr.length; while(leftright){ int midleft(right-left1)/2; if(!check(mid,r)) rightmid-1; else leftmid; } //个数下标1 return left1; } //移除前mid个下标对应字符后子序列还有p就返回true private boolean check(int mid,int[] r){ ListCharacter tmpnew ArrayList(lists); int index0; for(int i0;imid;i) tmp.remove(r[i]); for(char c:tmp) if(clistp.get(index)) index; return indexlistp.size()-1; } }