找回密码
 立即注册
首页 业界区 业界 hot100之滑动窗口

hot100之滑动窗口

崔和美 2025-6-9 10:49:05
无重复字符的最长字串(003)

先看代码
  1. class Solution {
  2.     public int lengthOfLongestSubstring(String s) {
  3.         int res = 0;
  4.         int lef = 0;
  5.         int rig = 0;
  6.         int[] memo = new int[128];
  7.         while (rig < s.length()){
  8.             char clef = s.charAt(lef);
  9.             char crig = s.charAt(rig);
  10.             if (memo[crig] > 0){
  11.                 memo[clef]--;
  12.                 lef++;
  13.                 continue;
  14.             }
  15.             memo[crig]++;
  16.             res = Math.max(res, rig - lef + 1);
  17.             rig++;
  18.         }
  19.         return res;
  20.     }
  21. }
复制代码

  • 分析
根据题目条件
通过lef和rig 维护一个滑动窗口, memo来记录遇到字符的次数
rig一直向右扩张, 当出现数字重复, 移动lef 收缩窗口

  • 感悟
寻找连续区间就让人很自然而然想到滑动窗口
每次窗口移动只用考虑(入窗口, 出窗口)的元素对窗口整体的影响
找到字符串中所有的字母异位词(438)

先看代码
  1. class Solution {
  2.     public List<Integer> findAnagrams(String s, String p) {
  3.         List<Integer> res = new ArrayList<>();
  4.         int lef = 0;
  5.         int rig = 0;
  6.         int[] memo = new int[26];
  7.         for (char c : p.toCharArray()){
  8.             memo[c - 'a']++;
  9.         }
  10.         while(rig < s.length()){
  11.             int idx = s.charAt(rig) - 'a';
  12.             memo[idx]--;
  13.             while(memo[idx] < 0){
  14.                 memo[s.charAt(lef) - 'a']++;
  15.                 lef++;
  16.             }
  17.             if (rig - lef + 1 == p.length()) res.add(lef);
  18.             rig++;
  19.         }
  20.         return res;
  21.     }
  22. }
复制代码

  • 分析
无重复字符的最长字串基本一致, 扩张收缩窗口, 达到条件添加到res

  • 感悟
暂无

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册