- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题:https://leetcode.com/problems/minimum-window-substring/
给定一个字符串 S 和一个字符串 T,找到 S 中包含 T 中所有字符的最小窗口,复杂度为 O(n)。
例子:
输入:S = "ADOBECODEBANC", T = "ABC"输出:“BANC”
我努力尝试使用滑动窗口技术提出解决方案,但我被困在这里。有人可以帮忙吗?
package com.tryPrep.Strings;
import java.util.HashMap;
public class MinWindowSubstring {
static String minWinSubStr(String s, String t){
HashMap<Character, Integer> tabl = new HashMap<>();
for(char c: t.toCharArray()){
int charCount=0;
if(tabl.containsKey(c))
charCount = tabl.get(c);
tabl.put(c, charCount+1);
}
int begin =0, end =0, counter=tabl.size();
String ans="";
int max=s.length();
while(end < s.length()) {
char endChar = s.charAt(end);
if (tabl.containsKey(endChar)) {
int charCount = tabl.get(endChar);
if (charCount > 0) {
counter--;
tabl.put(endChar, charCount - 1);
}
}
end++;
while (counter == 0) {
if (max > end - begin) {
ans = s.substring(begin, end - begin);
max = ans.length();
}
char beginChar = s.charAt(begin);
if (tabl.containsKey(beginChar)) {
int charCount = tabl.get(beginChar);
if(charCount == 0) {
tabl.put(beginChar, charCount + 1);
counter++;
}
}
begin++;
}
}
return ans;
}
public static void main(String[] args) {
String s = "ADOBECODEBANC";
String t = "ABC";
System.out.println("minWinSubStr M1 : " + minWinSubStr(s, t));
}
}
输出:
minWinSubStr M1 : ADOBEC
我看到当 end 达到字符串长度时循环得到满足,但这里的计数器仍然不为 0。你能告诉我解锁我的问题是什么吗?
最佳答案
问题是当您在删除 A(在索引 0 处)后递增计数器时。你开始寻找另一个 A 来弥补这一损失。
ADOBECODEBANC
^ ^
begin end
When you are doing that, unknowingly your code did not take B (at index 9) into account and end pointer reached A (at index 10).
之后,当开始指针到达 B(在索引 4 处)并且您递增计数器时,您的结束指针无法找到任何其他 B。
ADOBECODEBANC
^ ^
begin end
因此您得到的答案是ADOBEC
What you could do to correct that when end pointer finds any character which must be accounted, remove the first index of that character and add the one encountered recently.
Once that done you could easily ignore that character when begin pointer encounters it as the frequency of that character wouldn't affect.
This is valid since we want to shrink window from the beginning, not from the end.
在您的情况下,每次结束指针遇到 tabl 中的任何字符时,您都可以减少计数器。
现在,当开始指针遇到任何值为负的字符时,不要递增计数器,只需将值加一即可。
此外,您应该从头到尾打印值。s.substring(开始, 结束)
考虑 begin = 8 和 end = 10 的情况s.substring(8, 10),不是 s.substring(8, 2)
static String minWinSubStr(String s, String t) {
System.out.println(s);
System.out.println(t);
HashMap<Character, Integer> tabl = new HashMap<>();
for (char c : t.toCharArray()) {
int charCount = 0;
if (tabl.containsKey(c))
charCount = tabl.get(c);
tabl.put(c, charCount + 1);
}
int begin = 0, end = 0, counter = tabl.size();
String ans = "";
int max = s.length();
while (end < s.length()) {
char endChar = s.charAt(end);
if (tabl.containsKey(endChar)) {
int charCount = tabl.get(endChar);
if (charCount > 0) {
counter--;
}
tabl.put(endChar, charCount - 1);
}
end++;
while (counter == 0) {
if (max > end - begin) {
ans = s.substring(begin, end);
max = ans.length();
}
char beginChar = s.charAt(begin);
if (tabl.containsKey(beginChar)) {
int charCount = tabl.get(beginChar);
if(charCount < 0) {
tabl.put(beginChar, charCount + 1);
}
else if (charCount == 0) {
tabl.put(beginChar, charCount + 1);
counter++;
}
}
begin++;
}
}
return ans;
}
突出显示我更改的部分。
Note: This code solves only your use case and is NOT supposed to give AC on all test-cases.
关于java - find Minimum window substring - leetcode - 解决方案不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58037771/
我正在解决以下leetcode问题:。。递归解是平凡的,所以我试着想出迭代解。下面是我的解决方案:。问题是:代码相对冗长,难以阅读。我的想法是跟踪从顶部到当前节点的整个路径。但这与标准DFS不同,因为
我正在解决以下leetcode问题:。。递归的解决方案是微不足道的,所以我试图拿出迭代的解决方案。下面是我的解决方案:。问题是:代码相对冗长,难以阅读。我的想法是跟踪从顶部到当前节点的整个路径。但这与
我正在处理 'Two Sum' problem in Leetcode . 我确信这段代码是正确的,我已经在 Repl 中对其进行了测试,它看起来是正确的,但 Leetcode 给了我一个错误。 这是
我正在研究 leetcode“762. 二进制表示中设置位的质数”,并且我测试了我的代码在 Jupiter Notebook 上运行良好,当我迁移到 leetcode 时,它显示 null 作为最
题干 请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征: 每一行的数字都从左到右排序 每一行的第一个数字都比上一行最后一个数字大 用例 例如对于下面矩阵: [ [1,
LeetCode Monotone Stack Summary 单调栈小结 所谓的单调栈 Monotone Stack,就是栈内元素都是单调递增或者单调递减的,有时候需要严格的单调递增或递减,根据
第一题: 合并二叉树 LeetCode 617 : 合并二叉树 描述: 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的
和为k的子数组 LeetCode 560 和为k的不重复子数组个数(包含不连续): 和为k的子数组 LeetCode 560 Example 1: Input:nums=[1,1,1],k=2 Ou
1.题目描述: 难度:简单 描述: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X
1.题目描述: 难度:简单 描述: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,1
一、题目描述 难道:简单 描述: 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在
一、题目描述 难度:简单 描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs = ["flower","flow","flig
一、题目描述 难度:简单 描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4
@TOC 题目描述 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序
我已经在 Repl.it 网站上解决了这个问题,但是当我在 LeetCode 上提交代码时,它给出了一个 typeError,我将把它粘贴在这里: Line 29 in solution.js
var merge = function(nums1, m, nums2, n) { //contcating two array let array = nums2.concat(
我正在做以下leetCode问题:https://leetcode.com/problems/add-two-numbers/ 我不确定为什么我的一个测试用例失败了 所以问题是 You are giv
我正在尝试完成 Leetcode 上的 189. 旋转数组问题。这是我写的代码: class Solution(object): def rotate(self, nums, k):
该函数将反向打印链表的节点: void recur(ListNode head) { if(head == null) return; recur(head.next); tm
我正在尝试完成 Leetcode 上的 189. 旋转数组问题。这是我写的代码: class Solution(object): def rotate(self, nums, k):
我是一名优秀的程序员,十分优秀!