leetcode76 最小覆盖子串

举报
兔老大 发表于 2021/04/21 23:00:51 2021/04/21
【摘要】 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 思路:双指针,两个指针中间代表一个字符串。 都往右边走,满足...

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

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:

如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

思路:双指针,两个指针中间代表一个字符串。

都往右边走,满足条件就左指针向右(缩),不满足条件就右指针向右(扩)


  
  1. public String minWindow(String s, String t) {
  2. int[] map = new int[128];
  3. // 遍历字符串 t,初始化每个字母的次数
  4. for (int i = 0; i < t.length(); i++) {
  5. char char_i = t.charAt(i);
  6. map[char_i]++;
  7. }
  8. int left = 0; // 左指针
  9. int right = 0; // 右指针
  10. int ans_left = 0; // 保存最小窗口的左边界
  11. int ans_right = -1; // 保存最小窗口的右边界
  12. int ans_len = Integer.MAX_VALUE; // 当前最小窗口的长度
  13. int count = t.length();
  14. // 遍历字符串 s
  15. while (right < s.length()) {
  16. char char_right = s.charAt(right);
  17. // 当前的字母次数减一
  18. map[char_right]--;
  19. //代表当前符合了一个字母
  20. if (map[char_right] >= 0) {
  21. count--;
  22. }
  23. // 开始移动左指针,减小窗口
  24. while (count == 0) { // 如果当前窗口包含所有字母,就进入循环
  25. // 当前窗口大小
  26. int temp_len = right - left + 1;
  27. // 如果当前窗口更小,则更新相应变量
  28. if (temp_len < ans_len) {
  29. ans_left = left;
  30. ans_right = right;
  31. ans_len = temp_len;
  32. }
  33. // 得到左指针的字母
  34. char key = s.charAt(left);
  35. // 因为要把当前字母移除,所有相应次数要加 1
  36. map[key]++;
  37. //此时的 map[key] 大于 0 了,表示缺少当前字母了,count++
  38. if (map[key] > 0) {
  39. count++;
  40. }
  41. left++; // 左指针右移
  42. }
  43. // 右指针右移扩大窗口
  44. right++;
  45. }
  46. return s.substring(ans_left, ans_right + 1);
  47. }

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/103418798

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。