Java 题解 | #牛群名字覆盖#
牛群名字覆盖
https://www.nowcoder.com/practice/e6cef4702e7841f59cf47daf9bafb241
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param t string字符串
* @return string字符串
*/
public String minWindow (String s, String t) {
// write code here
int i, j, l, r, slen = s.length(), tlen = t.length(), remain;
String res = "";
if (slen >= tlen) {
Map<Character, Integer> mp = new HashMap<>();
for (i = 0; i < tlen; i++) {
char c = t.charAt(i);
mp.put(c, mp.getOrDefault(c, 0) + 1);
}
for (i = 0, j = 0, l = -1, r = -1, remain = tlen; j < slen; j++) {
char c = s.charAt(j);
if (mp.containsKey(c)) {
mp.put(c, mp.get(c) - 1);
if (mp.get(c) >= 0)
remain--;
if (remain == 0) {
while (!mp.containsKey(s.charAt(i)) || mp.get(s.charAt(i)) < 0) {
if (mp.containsKey(s.charAt(i)))
mp.put(s.charAt(i), mp.get(s.charAt(i)) + 1);
i++;
}
if (l == -1 && r == -1 || j - i < r - l) {
l = i;
r = j;
}
mp.put(s.charAt(i), mp.get(s.charAt(i)) + 1);
remain++;
i++;
}
}
}
if (l != -1 && r != -1)
res = s.substring(l, r + 1);
}
return res;
}
}
该代码使用的编程语言是Java。
此题考察的知识点是滑动窗口算法
这段代码实现了一个函数 minWindow,该函数接受两个字符串作为参数:s 和 t。它的目标是在字符串 s 中找到包含字符串 t 所有字符的最小窗口,并返回该窗口对应的子串。
代码中的主要逻辑如下:
- 判断字符串 s 的长度是否大于等于字符串 t 的长度。如果不满足这个条件,则直接返回空字符串。
- 创建一个 HashMap 对象 mp,用来存储字符串 t 中每个字符出现的频率。
- 遍历字符串 t,更新 mp 中每个字符的频率。
- 初始化双指针 i 和 j 分别指向字符串 s 的起始位置,并设置初始窗口的左边界 l 和右边界 r 为 -1。设置变量 remain 表示还需要匹配的字符个数,并将其初始化为字符串 t 的长度。
- 使用一个循环遍历字符串 s,从左到右依次移动右指针 j。在每次移动右指针后,更新 mp 中相应字符的频率,并根据频率判断是否匹配到了一个字符。
- 当窗口中包含了全部需要匹配的字符时,开始移动左指针 i 来尝试缩小窗口的大小。具体操作是,当遇到一个不在字符串 t 中的字符或者某个字符在窗口中的出现频率超过了在 t 中的出现频率时,将左指针右移,并更新 mp 中对应字符的频率。
- 当不能再移动左指针 i 时,表示窗口已经缩小到最小,并且包含了字符串 t 的所有字符。此时,如果窗口的大小比之前找到的最小窗口还要小,就更新最小窗口的起始位置和终止位置。
- 根据最小窗口的起始位置和终止位置,在原字符串 s 中提取出最小窗口对应的子串,并将其赋值给变量 res。
- 如果最小窗口的起始位置和终止位置都不是 -1,则将子串赋值给变量 res。最终,返回 res。
