注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
本帖最后由 yanjinbin 于 2019-12-22 19:49 编辑
- public String minimumWindow(String s, String t) {
- int l = 0, r = 0, N = s.length() , start = 0, minLen = Integer.MAX_VALUE;
- Map<Character, Integer> needs = new HashMap();
- for (char c : t.toCharArray()) {
- needs.put(c, needs.getOrDefault(c, 0) + 1);
- }
- Map<Character, Integer> windows = new HashMap();
- int match = 0;
- while (r < N) {
- char c1 = s.charAt(r);
- if (needs.containsKey(c1)) {
- windows.put(c1, windows.getOrDefault(c1, 0) + 1);
- if (windows.get(c1) == needs.get(c1)) {
- match++;
- }
- }
- r++;
- // find 可行解, pursue 最优解
- while (match == needs.size()) {
- // update
- if (r - l < minLen) {
- start = l;
- minLen = r - l;
- }
- char c2 = s.charAt(l);
- if (needs.containsKey(c2)) {
- windows.put(c2, windows.get(c2) - 1);
- if (windows.get(c2) < needs.get(c2)) {
- match--;
- }
- }
- l++;
- }
- }
- return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);
- }
复制代码
跪求各位大佬看下 ,看不出破绽 ,是滑动窗口双指针啊
主要是 最后一个case 输入数据太大了
第二种写法 就能AC通过- public String minimumWindow02(String s, String t) {
- if (s == null || t == null || s.length() == 0 || t.length() == 0 || s.length() < t.length()) return "";
- int[] bank = new int[26];
- int l = 0, r = 0, count = 0;
- int minLen = Integer.MAX_VALUE;
- String ans = "";
- for (int i = 0; i < t.length(); i++) {
- bank[t.charAt(i) - 'A']++;
- }
- while (r < s.length()) {
- if (bank[s.charAt(r++) - 'A'] > 0) {
- bank[s.charAt(r++) - 'A']--;
- count++;
- }
- //可行解
- while (count == t.length()) {
- if (minLen > r - l) {
- minLen = r - l;
- ans = s.substring(l, r);
- }
- // 这里需要解释下
- // narrow l
- if (bank[s.charAt(l) - 'A'] == 0) {
- bank[s.charAt(l) - 'A']++;
- count--;
- }
- l++;
- }
- }
- return ans;
- }
复制代码
|