滑动窗口---最小覆盖子串、字母异位词、

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。

 1 /*
 2 * https://leetcode-cn.com/problems/minimum-window-substring/
 3 *
 4 * 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
 5 * */
 6 import java.util.HashMap;
 7 
 8 public class code076_MinimumWindowSubstring
 9 {
10     public String minWindow(String s, String t) {
11         if (s.length() == 0 || t.length() == 0){
12             return "";
13         }
14         int start = 0, minLen = Integer.MAX_VALUE;
15         HashMap<Character, Integer> window = new HashMap<>();
16         HashMap<Character, Integer> needs = new HashMap<>();
17         int left = 0, right = 0;
18         for (int i = 0; i < t.length(); i++)
19         {
20             needs.put(t.charAt(i), needs.getOrDefault(t.charAt(i), 0) + 1);
21         }
22         int match = 0;
23         while (right < s.length()){
24             char c = s.charAt(right);
25             if(needs.containsKey(c)){
26                 window.put(c, window.getOrDefault(c, 0) + 1);
27                 if(needs.get(c).compareTo(window.get(c)) == 0){
28                     match++;
29                 }
30             }
31             right++;
32 
33             while (match == needs.size()){
34                 if(right - left < minLen){
35                     start = left;
36                     minLen = right - left;
37                     System.out.println(minLen);
38                 }
39                 char c1 = s.charAt(left);
40                 if(needs.containsKey(c1)){
41                     int num = window.get(c1);
42                     window.put(c1, num - 1);
43                     // System.out.println(String.valueOf(right) + ";" + c1 + ";" + String.valueOf(window.get(c1)));
44                     if(window.get(c1) < needs.get(c1))
45                         match--;
46                 }
47                 left++;
48             }
49         }
50         return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);
51     }
52     public static void main(String[] args){
53         code076_MinimumWindowSubstring minimumWindowSubstring = new code076_MinimumWindowSubstring();
54         System.out.println(minimumWindowSubstring.minWindow("EBBANCF", "ABC"));
55         System.out.println(minimumWindowSubstring.minWindow("ADOBECODEBANC", "ABC"));
56         System.out.println(minimumWindowSubstring.minWindow("a", "aa"));
57 
58     }
59 }

 

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

 1 import java.util.ArrayList;
 2 import java.util.HashMap;
 3 import java.util.List;
 4 
 5 public class code438_FindAllAnagramsinaString
 6 {
 7     public List<Integer> findAnagrams(String s, String p) {
 8         List<Integer> list = new ArrayList<>();
 9         if (s.length() == 0 || p.length() == 0){
10             return list;
11         }
12         HashMap<Character, Integer> window = new HashMap<>();
13         HashMap<Character, Integer> needs = new HashMap<>();
14         int left = 0, right = 0;
15         for (int i = 0; i < p.length(); i++)
16         {
17             needs.put(p.charAt(i), needs.getOrDefault(p.charAt(i), 0) + 1);
18         }
19         int match = 0;
20         while (right < s.length()){
21             char c = s.charAt(right);
22             if(needs.containsKey(c)){
23                 window.put(c, window.getOrDefault(c, 0) + 1);
24                 if(needs.get(c).compareTo(window.get(c)) == 0){
25                     match++;
26                 }
27             }
28             right++;
29 
30             while (match == needs.size()){
31                 if(right - left == p.length()){
32                     list.add(left);
33                 }
34                 char c1 = s.charAt(left);
35                 if(needs.containsKey(c1)){
36                     int num = window.get(c1);
37                     window.put(c1, num - 1);
38                     if(window.get(c1) < needs.get(c1))
39                         match--;
40                 }
41                 left++;
42             }
43         }
44         return list;
45     }
46 }

 

posted @ 2020-04-05 17:06  ~花开不败~  阅读(171)  评论(0编辑  收藏  举报