leetcode 76 最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-window-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution { public String minWindow(String s, String t) { if (s.length() < t.length() || s.length() == 0 || s == null) { return ""; } Map<Character, Integer> t_map = new HashMap<>(); for (int i = 0; i < t.length(); i++) { t_map.put(t.charAt(i), t_map.getOrDefault(t.charAt(i), 0) + 1); } Map<Character, Integer> s_map = new HashMap<>(); // 满足条件的字符串 int valid = 0; // 左右指针 int left = 0, right = 0; // 记录最小的窗口 int min_len = Integer.MAX_VALUE, min_left = 0; while (right < s.length()) { char ch = s.charAt(right); // 扩大右边界 right++; s_map.put(ch, s_map.getOrDefault(ch, 0) + 1); if (s_map.get(ch).equals(t_map.get(ch))) { valid++; } // 当满足条件的时候,需要缩小窗口,增大左指针 while (valid == t_map.size()) { if (right - left < min_len) { min_len = right - left; min_left = left; } char c = s.charAt(left); if (s_map.get(c).equals(t_map.get(c))) { valid--; } s_map.put(c, s_map.get(c) - 1); left++; } } return min_len == Integer.MAX_VALUE ? "" : s.substring(min_left, min_len + min_left); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步