zoukankan      html  css  js  c++  java
  • 滑动窗口---最小覆盖子串、字母异位词、

    给你一个字符串 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 }
  • 相关阅读:
    HDU 5311
    HDU 1708
    HDU 1707
    计蒜之道 430
    Codeforces Round #292 (Div. 2)——C——Drazil and Factorial
    Codeforces Round #292 (Div. 2)——B——Drazil and His Happy Friends
    Codeforces Round #292 (Div. 2)——A——Drazil and Date
    Codeforces Round #293 (Div. 2)——C——Anya and Smartphone
    Codeforces Round #293 (Div. 2)——B——Tanya and Postcard
    Codeforces Round #293 (Div. 2)——A—— Vitaly and Strings
  • 原文地址:https://www.cnblogs.com/Z-D-/p/12637975.html
Copyright © 2011-2022 走看看