查看: 1770| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[字符串] 76 为什么我的滑 动窗口 最后一个 case就是通不过

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 yanjinbin 于 2019-12-22 19:49 编辑
  1. public String minimumWindow(String s, String t) {
  2.         int l = 0, r = 0, N = s.length() , start = 0, minLen = Integer.MAX_VALUE;
  3.         Map<Character, Integer> needs = new HashMap();
  4.         for (char c : t.toCharArray()) {
  5.             needs.put(c, needs.getOrDefault(c, 0) + 1);
  6.         }
  7.         Map<Character, Integer> windows = new HashMap();
  8.         int match = 0;
  9.         while (r < N) {
  10.             char c1 = s.charAt(r);
  11.             if (needs.containsKey(c1)) {
  12.                 windows.put(c1, windows.getOrDefault(c1, 0) + 1);
  13.                 if (windows.get(c1) == needs.get(c1)) {
  14.                     match++;
  15.                 }
  16.             }
  17.             r++;

  18.             // find 可行解, pursue 最优解
  19.             while (match == needs.size()) {
  20.                 // update
  21.                 if (r - l < minLen) {
  22.                     start = l;
  23.                     minLen = r - l;
  24.                 }
  25.                 char c2 = s.charAt(l);
  26.                 if (needs.containsKey(c2)) {
  27.                     windows.put(c2, windows.get(c2) - 1);
  28.                     if (windows.get(c2) < needs.get(c2)) {
  29.                         match--;
  30.                     }
  31.                 }
  32.                 l++;
  33.             }
  34.         }
  35.         return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);
  36.     }
复制代码

跪求各位大佬看下  ,看不出破绽  ,是滑动窗口双指针啊
主要是 最后一个case 输入数据太大了


第二种写法 就能AC通过
  1. public String minimumWindow02(String s, String t) {
  2.         if (s == null || t == null || s.length() == 0 || t.length() == 0 || s.length() < t.length()) return "";
  3.         int[] bank = new int[26];
  4.         int l = 0, r = 0, count = 0;
  5.         int minLen = Integer.MAX_VALUE;
  6.         String ans = "";
  7.         for (int i = 0; i < t.length(); i++) {
  8.             bank[t.charAt(i) - 'A']++;
  9.         }
  10.         while (r < s.length()) {
  11.             if (bank[s.charAt(r++) - 'A'] > 0) {
  12.                 bank[s.charAt(r++) - 'A']--;
  13.                 count++;
  14.             }
  15.             //可行解
  16.             while (count == t.length()) {
  17.                 if (minLen > r - l) {
  18.                     minLen = r - l;
  19.                     ans = s.substring(l, r);
  20.                 }
  21.                 // 这里需要解释下
  22.                 // narrow l
  23.                 if (bank[s.charAt(l) - 'A'] == 0) {
  24.                     bank[s.charAt(l) - 'A']++;
  25.                     count--;
  26.                 }
  27.                 l++;
  28.             }
  29.         }
  30.         return ans;
  31.     }
复制代码



上一篇:请教一道amazon面试题 video watched by friends
下一篇:Leetcode周赛实时录屏+讲解(争取持续更新)
推荐
337845818 2019-12-23 07:50:24 | 只看该作者
全局:
本帖最后由 337845818 于 2019-12-23 07:53 编辑

看了很久, 也测了很久。

加一个强转

或者用。equals



大概率是因为你用两个Integer去比较了, 所以会出现错误。

Integer直接比较的话-128到127之间有cache, 范围外就相当于比较地址了。

https://stackoverflow.com/questi ... rent-results-for-12

https://stackoverflow.com/questi ... he-range-128-to-127

评分

参与人数 2大米 +4 收起 理由
WKelvinson + 2 谢谢老哥,学到了
yanjinbin + 2 恨不得给你多加点 谢谢大佬

查看全部评分

回复

使用道具 举报

🔗
 楼主| yanjinbin 2019-12-22 19:31:22 | 只看该作者
全局:
发现 解1的match和解2 count 各代表的意思 并不相同, 但是 依旧没有理解  为什么 不行
回复

使用道具 举报

全局:
第一种写法最后是wrong answer还是TLE?
回复

使用道具 举报

🔗
 楼主| yanjinbin 2019-12-23 11:28:23 | 只看该作者
全局:
  1. public String minimumWindow01(String s, String t) {
  2.         int count = 0, l = 0, r = 0, minLen = Integer.MAX_VALUE;
  3.         String ans = "";
  4.         int[] bank = new int[127];
  5.         for (char c : t.toCharArray()) {
  6.             bank[c - 'A']++;
  7.         }

  8.         while (r < s.length()) {
  9.             char c1 = s.charAt(r);
  10.             if (bank[c1 - 'A'] > 0) { // 匹配了
  11.                 count++;
  12.             }
  13.             bank[c1 - 'A']--;
  14.             r++;
  15.             while (count == t.length()) {
  16.                 if (minLen > r - l) {
  17.                     minLen = r - l;
  18.                     ans = s.substring(l, r);
  19.                 }
  20.                 char c2 = s.charAt(l);
  21.                 if (bank[c2 - 'A'] == 0) {// 匹配了
  22.                     count--;
  23.                 }
  24.                 bank[c2 - 'A']++;
  25.                 l++;
  26.             }
  27.         }
  28.         return ans;
  29.     }
复制代码


醉了 主贴 第二种方案 有点错误  不能通过  
现在附上能通过  不好意思啊
回复

使用道具 举报

🔗
 楼主| yanjinbin 2019-12-23 11:32:45 | 只看该作者
全局:
337845818 发表于 2019-12-23 07:50
看了很久, 也测了很久。

加一个强转
恨不得给你多加点 谢谢大佬
回复

使用道具 举报

🔗
 楼主| yanjinbin 2019-12-23 11:33:15 | 只看该作者
全局:
337845818 发表于 2019-12-23 07:50
看了很久, 也测了很久。

加一个强转

谢谢大佬 确实是 Integer cache和 ==惹的祸
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表