题解 | #寻找完成任务所需最短时间#
寻找完成任务所需最短时间
https://www.nowcoder.com/practice/107342346ad44329a35c7e5b890e7d40
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param t string字符串
* @return string字符串
*/
public static String minWindow (String s, String t) {
// write code here
int count = t.length();
Map<Character, Integer> map = new HashMap<>();
for (char c : t.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
int left = 0;
int right = 0;
String result = "";
int string_len = Integer.MAX_VALUE;
while (right < s.length()) {
if (map.containsKey(s.charAt(right))) {
map.put(s.charAt(right), map.get(s.charAt(right)) - 1);
if (map.get(s.charAt(right)) >= 0) {
count--;
}
}
right++;
while (count == 0) {
if (map.containsKey(s.charAt(left))) {
map.put(s.charAt(left), map.get(s.charAt(left)) + 1);
if (map.get(s.charAt(left)) > 0) {
count++;
if (right - left < string_len) {
string_len = (right - left);
result = s.substring(left, left + string_len);
}
}
}
left++;
}
}
return string_len == Integer.MAX_VALUE ? "" : result;
}
}
本题考察的知识点是滑动窗口和哈希表的应用,所用编程语言是java。
我们可以考虑使用哈希表来统计字符串t的各字符出现频率,然后利用一个计数器来统计目前需要匹配多少个字符。首先定义两个指针left和right,分别赋初值为0,我们滑动right指针遍历s字符串的各个字符,然后判断该字符是否在哈希表中出现过。
如果出现过,则相应键值对应的value值应该要减一,然后判断该键值对应的value值是否大于等于0,
如果是则count-1,表明已经成功匹配了一个字符。当count为0,我们应该停止滑动right指针,而滑动left指针,缩小窗口范围来找到最短的字符串,当map匹配到相应的key值,相应key值对应的value值加一,然后判断value值是否大于0时,如果是,说明此时已经找到了一个相对于right位置最短的字符串来满足题目的条件。然后应该滑动right指针,继续寻找,知道到达s字符串的末尾

