九 76: 最小覆盖子串
76. 最小覆盖子串https://leetcode.cn/problems/minimum-window-substring/给定两个字符串s和t长度分别是m和n返回 s 中的最短窗口 子串使得该子串包含t中的每一个字符包括重复字符。如果没有这样的子串返回空字符串。测试用例保证答案唯一。给定两个字符串s和t长度分别是m和n返回 s 中的最短窗口 子串使得该子串包含t中的每一个字符包括重复字符。如果没有这样的子串返回空字符串。测试用例保证答案唯一。示例 1输入s ADOBECODEBANC, t ABC输出BANC解释最小覆盖子串 BANC 包含来自字符串 t 的 A、B 和 C。示例 2输入s a, t a输出a解释整个字符串 s 是最小覆盖子串。示例 3:输入:s a, t aa输出:解释:t 中两个字符 a 均应包含在 s 的子串中 因此没有符合条件的子字符串返回空字符串。提示m s.lengthn t.length1 m, n 105s和t由英文字母组成进阶你能设计一个在O(m n)时间内解决此问题的算法吗class Solution { public String minWindow(String s, String t) { // need: 记录t中每个字符需要的数量 MapCharacter, Integer need new HashMap(); // window: 记录s的当前窗口中所需字符的实际数量left-right才是窗口window只是记录所需字符的实际数量 MapCharacter, Integer window new HashMap(); // 初始化need for(char c : t.toCharArray()){ need.put(c, need.getOrDefault(c, 0) 1); } int left 0, right 0;// 左右边界 int valid 0;// 窗口中满足need条件的字符种类数 int start 0, len Integer.MAX_VALUE; // 记录最小窗口的起始位置和长度 while(right s.length()){ // 1. 扩大窗口将s[right]加入窗口 char c s.charAt(right); right;// 右边界右移 // 更新窗口数据 if(need.containsKey(c)){ window.put(c, window.getOrDefault(c, 0) 1); // 注意只有数量刚好相等时才增加valid多了不算 if(window.get(c).equals(need.get(c))){ valid; } } // 2. 收缩窗口当窗口满足条件时尝试缩小 while(valid need.size()){ // 更新最小窗口 if(right - left len){ start left; len right - left; } // 将s[left]移出窗口 char d s.charAt(left); left;// 左边界右移 // 更新窗口数据 if(need.containsKey(d)){ // 注意只有数量刚好相等时才减少valid if(window.get(d).equals(need.get(d))){ valid--; } window.put(d, window.getOrDefault(d, 0) - 1); } } } return len Integer.MAX_VALUE ? : s.substring(start, start len); } }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2444297.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!