2018-07-18 11:19:19

一、Minimum Window Substring

问题描述:

问题求解:

  1. public String minWindow(String s, String t) {
  2. String res = "";
  3. if (t.length() > s.length()) return res;
  4. Map<Character, Integer> map = new HashMap<>();
  5. for (int i = 0; i < t.length(); i++) {
  6. map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) + 1);
  7. }
  8. int begin, end, count;
  9. begin = 0;
  10. end = 0;
  11. count = map.size();
  12. int minLen = Integer.MAX_VALUE;
  13. for (; end < s.length(); end++) {
  14. char c = s.charAt(end);
  15. if (map.containsKey(c)) {
  16. map.put(c, map.get(c) - 1);
  17. if (map.get(c) == 0) count--;
  18. }
  19. while (count == 0) {
  20. if (end - begin + 1 < minLen) {
  21. res = s.substring(begin, end);
  22. minLen = end - begin + 1;
  23. }
  24. char temp = s.charAt(begin);
  25. if (map.containsKey(temp)) {
  26. if (map.get(temp) == 0) count++;
  27. map.put(temp, map.get(temp) + 1);
  28. }
  29. begin++;
  30. }
  31. }
  32. return res;
  33. }

二、Longest Substring Without Repeating Characters

问题描述:

问题求解:

  1. public int lengthOfLongestSubstring(String s) {
  2. int[] map = new int[256];
  3. int res = 0;
  4. int begin = 0;
  5. for (int end = 0; end < s.length(); end++) {
  6. char c = s.charAt(end);
  7. map[c]++;
  8. while (map[c] > 1) {
  9. map[s.charAt(begin)]--;
  10. begin++;
  11. }
  12. res = Math.max(res, end - begin + 1);
  13. }
  14. return res;
  15. }

三、Substring with Concatenation of All Words

问题描述:

问题求解:

本题其实是一道拓展题,这里题目中给出了所有单词的长度相同,也就意味着可以将所有的单词看作单个字母来进行处理,如果是这样的话,那么外层循环很显然就是word length了。之后通过两个Map对单词进行计数就可以进行解决。

  1. public List<Integer> findSubstring(String s, String[] words) {
  2. List<Integer> res = new ArrayList<>();
  3. if (s == null || s.length() == 0 || words.length == 0) return res;
  4. Map<String, Integer> map = new HashMap<>();
  5. int wl = words[0].length();
  6. int num = words.length;
  7. int n = s.length();
  8. if (n < num * wl) return res;
  9. for (int i = 0; i < num; i++)
  10. map.put(words[i], map.getOrDefault(words[i], 0) + 1);
  11. for (int i = 0; i < wl; i++) {
  12. int begin, end, cnt;
  13. Map<String, Integer> seen = new HashMap<>();
  14. begin = i;
  15. cnt = 0;
  16. for (end = begin; end <= n - wl; end += wl) {
  17. String str = s.substring(end, end + wl);
  18. // 匹配成功
  19. if (map.containsKey(str)) {
  20. seen.put(str, seen.getOrDefault(str, 0) + 1);
  21. cnt++;
  22. // 若计数个数超过map, 则需要对窗口大小进行调整
  23. while (seen.get(str) > map.get(str)) {
  24. String temp = s.substring(begin, begin + wl);
  25. seen.put(temp, seen.get(temp) - 1);
  26. begin = begin + wl;
  27. cnt--;
  28. }
  29. // 如果所有单词都匹配完成, 则向res中添加答案,同时将窗口大小向前挪动一步
  30. if (cnt == num) {
  31. res.add(begin);
  32. String temp = s.substring(begin, begin + wl);
  33. seen.put(temp, seen.get(temp) - 1);
  34. begin = begin + wl;
  35. cnt--;
  36. }
  37. }
  38. // 当前匹配失败,则begin要从下一个开始,且所有的计数都要初始化
  39. else {
  40. seen.clear();
  41. begin = end + wl;
  42. cnt = 0;
  43. }
  44. }
  45. }
  46. return res;
  47. }

四、Longest Substring with At Least K Repeating Characters

问题描述:

问题求解:

单纯的使用滑动窗口在修改窗口大小的时候会出现难以判断的情况,可以引入uniqueNum这个变量,来表征K个不同的字母,这样就可以大大降低问题的复杂度。

  1. public int longestSubstring(String s, int k) {
  2. int res = 0;
  3. char[] chs = s.toCharArray();
  4. for (int i = 1; i <= 26; i++) {
  5. res = Math.max(res, helper(chs, k, i));
  6. }
  7. return res;
  8. }
  9.  
  10. private int helper(char[] chs, int k, int uniqueNum) {
  11. int res = 0;
  12. int[] cnt = new int[256];
  13. int begin = 0;
  14. int nolessthank = 0;
  15. int curUnique = 0;
  16. for (int end = 0; end < chs.length; end++) {
  17. if (cnt[chs[end]] == 0) curUnique++;
  18. if (cnt[chs[end]] == k - 1) nolessthank++;
  19. cnt[chs[end]]++;
  20. while (curUnique > uniqueNum) {
  21. if (cnt[chs[begin]] == k) nolessthank--;
  22. if (cnt[chs[begin]] == 1) curUnique--;
  23. cnt[chs[begin]]--;
  24. begin++;
  25. }
  26. if (curUnique == uniqueNum && nolessthank == curUnique)
  27. res = Math.max(res, end - begin + 1);
  28. }
  29. return res;
  30. }

五、Max Consecutive Ones III 

问题描述:

问题求解:

这种问题一般要么dp,要么滑动窗口,这种敏感性要有。

本题就是使用滑动窗口来进行解决的问题。实质上就是求解最长的substring其中至多包含k个0。

  1. public int longestOnes(int[] A, int K) {
  2. int res = 0;
  3. int begin = 0;
  4. int cnt = 0;
  5. for (int end = 0; end < A.length; end++) {
  6. if (A[end] == 0) cnt+= 1;
  7. while (cnt > K) {
  8. if (A[begin] == 0) cnt -= 1;
  9. begin++;
  10. }
  11. res = Math.max(res, end - begin + 1);
  12. }
  13. return res;
  14. }

  

滑动窗口-Substring Search Problem的更多相关文章

  1. 滑动窗口解决Substring Search Problem

    2018-07-18 11:19:19 一.Minimum Window Substring 问题描述: 问题求解: public String minWindow(String s, String ...

  2. [Leetcode 3] 最长不重复子串 Longest substring without repeating 滑动窗口

    [题目] Given a string, find the length of the longest substring without repeating characters. [举例] Exa ...

  3. POJ 3320 Jessica's Reading Problem (滑动窗口)

    题意:给定一个序列,求一个最短区间,使得这个区间包含所有的种类数. 析:最近刚做了几个滑动窗口的题,这个很明显也是,肯定不能暴力啊,时间承受不了啊,所以 我们使用滑动窗口来解决,要算出所有的种数,我用 ...

  4. leetcode 3 Longest Substring Without Repeating Characters(滑动窗口)

    用滑动窗口的思想来做.用一个unordered_map来查询之前的char有没有在现在的窗口中. class Solution { public: int lengthOfLongestSubstri ...

  5. [LeetCode] Sliding Window Maximum 滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  6. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  7. CodeForces 701C They Are Everywhere (滑动窗口)

    题目链接:http://codeforces.com/problemset/problem/701/C 题意:找到字符串中能包含所有元素的最短字符串长度. 利用“滑动窗口”解题 解题思路: 1. 遍历 ...

  8. hdu-5497 Inversion(滑动窗口+树状数组)

    题目链接: Inversion Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  9. [CF580B]Kefa and Company(滑动窗口)

    题目链接:http://codeforces.com/problemset/problem/580/B 某人有n个朋友,这n个朋友有钱数m和关系s两个属性.问如何选择朋友,使得这些朋友之间s最大差距小 ...

随机推荐

  1. appium使用相对坐标定位元素

    最近在用appium做自动化时发现,有一些元素无法通过uiautomatorviewer进行定位,这样就只能通过相对坐标来进行定位了.但是,问题又来了:如何获取元素的坐标呢? 在网上找了半天也没找到相 ...

  2. django--ajax的使用,应用

    Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数 ...

  3. Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名

    Apk签名,每一个Android开发者都不陌生.它就是对我们的apk加了一个校验参数,防止apk被掉包.一开始做Android开发,就接触到了apk签名:后来在微信开放平台.高德地图等平台注册时,需要 ...

  4. springDataJPA笔记

    springDataJPA笔记 第一 orm思想 主要目的:操作实体类就相当于操作数据库表 建立两个映射关系: 实体类和表的映射关系 实体类中属性和表中字段的映射关系 不再重点关注:sql语句 实现了 ...

  5. 压力测试(六)-阿里云Linux服务器压测接口实战

    1.SpringBoot 接口打包,并用jar包方式部署 简介:用jar包方式在控制台进行启动 打包 mvn package && java -jar target/gs-spring ...

  6. 7-1 jmu-python-汇率兑换 (10 分)

    7-1 jmu-python-汇率兑换 (10 分)   按照1美元=6人民币的汇率编写一个美元和人民币的双向兑换程序 输入格式: 输入人民币或美元的金额,人民币格式如:R100,美元格式如:$100 ...

  7. 前端每日实战:17# 视频演示如何用纯 CSS 创作炫酷的同心矩形旋转动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/bMvbRp 可交互视频教程 此视频 ...

  8. flask前端上传图片/文件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 关于Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析

    1.Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service和 @Controller 其实这三个跟@Com ...

  10. Win10系统下安装tensorflow(cpu)+keras+jupyter notebook运行环境

    记录,自用 1.安装Anaconda(这里安装的是python3.6版本) 2.创建tensorflow的conda环境 conda create -n tensorflow python=3.6 3 ...