76. Minimum Window Substring
一、题目
1、审题
2、分析
给出两个字符串 s 与 t,求 t 中所有字符在 s 中都出现的最短长度的 s 的一个子串。若 s 中不存在这样的子串,返回空。
二、解答
1、思路:
①、用 HashMap 存储 t 的字符,其中 key 为 字符, value 为出现的次数。
②、遍历 s 中的字符,并判断是否是 t 中的待匹配的字符,
若是,则记录匹配的字符的变量 count++;同时,map 中的对应的 --value;
若不是,继续遍历。
③、若 count == t.length(),则此时找到 s 的一个匹配的子串。
判断该子串是否长度更小,若是,则进行下标的记录。
指向该子串左端的指针开始右移动,同时 Map中的 value 进行更改,并且 count--;
④、遍历完成后,输出。
public String minWindow(String s, String t) { int len1 = s.length(); int len2 = t.length(); if(len1 == 0 || len2 == 0 || len1 < len2) return ""; Map<Character, Integer> map = new HashMap<Character, Integer>(); for(char c: t.toCharArray()) if(map.containsKey(c)) map.put(c, map.get(c) + 1); else map.put(c, 1); int left = 0; // 当前查找的子串的开始 int minLeft = 0; // 总的最小子串的开始 int minLen = len1 + 1; // 记录最小子串的长度 int count = 0; // t 中匹配的字符的个数 for(int right = 0; right < s.length(); right++) { char c = s.charAt(right); Integer value = map.get(c); if(map.containsKey(c)) { map.put(c, --value); if(value >= 0) count++; } // 还原 Map 值 while(count == len2) { if(right - left + 1 < minLen) { // 这个串更小 minLeft = left; minLen = right - left + 1; } c = s.charAt(left); if(map.containsKey(c)) { value = map.get(c); map.put(c, ++value); if(value > 0) count--; } left++; // } } if(minLen > len1) return ""; return s.substring(minLeft, minLeft + minLen); }