算法——滑動窗口(Sliding Window)

一、背景知識

  • 滑動窗口算法(Sliding Window)
    • 在給定數組 / 字符串上維護一個固定長度或不定長度的窗口。可以對窗口進行滑動操作、縮放操作,以及維護最優解操作。
    • 題型一:固定長度
    • 題型二:不固定長度

?二、例題

1、無重復字符的最長子串(不定長度)

寫法一: 我的答案

class Solution {public int lengthOfLongestSubstring(String s) {if(s.length()==0){return 0;}int l=0;//左指針int r=0;//右指針int maxLen=1;List<Character> list=new ArrayList<>();while(r<s.length() && l<s.length()){if(!list.contains(s.charAt(r))){list.add(s.charAt(r));//窗口右側擴張maxLen=Math.max(maxLen,r-l+1);//維護一個子串長度的最大值r++;}else{int index=list.indexOf(s.charAt(r));//在窗口里查找被重復的字符的下標delItems(index,list);//把重復字符及其以前的字符移出窗口l=l+index+1;//窗口左側收縮}}return maxLen;}//public void delItems(int end,List list){while(end>=0){//從后往前刪list.remove(end);end--;}}
}

寫法二:?官方答案

外循環(for)枚舉字符串s的所有字符,當作滑動窗口的左邊界,進入內循環(while)后,不斷往右移,直到遇到重復的字符后,跳出內循環。

更新最長子串長度,刪除滑動窗口最左邊的一個元素。

如果該元素不是被重復的元素,就不會再次進入內循環,而是一直在外循環徘徊,一個接一個地刪掉滑動窗口最左邊的元素,直到刪掉那個被重復的元素

class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合,記錄每個字符是否出現過,相當于滑動窗口Set<Character> occ = new HashSet<Character>();int n = s.length();// 右指針,初始值為 -1,相當于我們在字符串的左邊界的左側,還沒有開始移動int rk = -1, ans = 0;for (int i = 0; i < n; ++i) {if (i != 0) {// 左指針向右移動一格,哈希集合移除一個字符occ.remove(s.charAt(i - 1));}while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {// 不斷地移動右指針,哈希集合增加一個字符 occ.add(s.charAt(rk + 1));++rk;}// 第 i 到 rk 個字符是一個極長的無重復字符子串// rk-i+1為當前滑動窗口內的子串長度ans = Math.max(ans, rk - i + 1);}return ans;}
}

2、找到字符串中所有字母異位詞

該題用排序法會超時,用鏈表或哈希表會超出內存限制?

寫法一:

突破點:

在字符串 s中構造一個長度為與字符串 p的長度相同的滑動窗口,并在滑動中維護窗口中每種字母的數量;當窗口中每種字母的數量與字符串 p中每種字母的數量相同時,則說明當前窗口為字符串 p的異位詞。

class Solution {public List<Integer> findAnagrams(String s, String p) {int sLen = s.length(), pLen = p.length();//當字符串 s 的長度小于字符串 p 的長度時,字符串 s 中一定不存在字符串 p 的異位詞if (sLen < pLen) {return new ArrayList<Integer>();}List<Integer> ans = new ArrayList<Integer>();int[] sCount = new int[26];//計算字符串s中26個字母出現的個數int[] pCount = new int[26];//計算字符串p中26個字母出現的個數for (int i = 0; i < pLen; ++i) {++sCount[s.charAt(i) - 'a'];++pCount[p.charAt(i) - 'a'];}if (Arrays.equals(sCount, pCount)) {//兩個數組相等,找到異位詞ans.add(0);//記錄初始下標}//窗口開始滑動for (int i = 0; i < sLen - pLen; ++i) {//用滑動窗口遍歷字符串s--sCount[s.charAt(i) - 'a'];//滑動窗口左邊界收縮,sCount數組里該字母的個數減1++sCount[s.charAt(i + pLen) - 'a'];//滑動窗口右邊界擴張,sCount數組里該字母的個數加1if (Arrays.equals(sCount, pCount)) {//找到異位詞ans.add(i + 1);}}return ans;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161670.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TypeScript 學習筆記 第二部分 webpack 創建typescript項目

【視頻鏈接】尚硅谷TypeScript教程&#xff08;李立超老師TS新課&#xff09; 創建webpack 項目 IDE&#xff1a;webstorm 新建一個空的項目運行npm init初始化項目目錄結構 1. 安裝 webpack&#xff1a;構建工具webpack-cli&#xff1a; webpack的命令行工具typescript&am…

PCIE鏈路訓練-狀態機描述1

狀態機描述 Config.linkwidth.start&#xff1a; 1. &#xff08;1&#xff09;Linkup 0 狀態機沒有執行鏈路寬度的升級&#xff08;upconfiguration of the Link width&#xff09;&#xff1a;那么tx會在所有active的dsp上發送TS1&#xff0c;其中link num為具體內容&a…

git stash 用法總結

目錄 1&#xff0c;介紹場景1&#xff1a;場景2&#xff1a; 2&#xff0c;常用命令2.1&#xff0c;基礎2.2&#xff0c;進階1&#xff0c;存儲時指定備注2&#xff0c;通過索引來操作指定的存儲3&#xff0c;修改存儲規則 2.3&#xff0c;查看 stash 修改的具體內容 1&#xf…

Element UI之Dialog 對話框

Dialog 對話框 用于彈出窗口 按需引入方式 如果是完整引入可跳過此步驟 import Vue from vue import { Dialog } from element-ui import element-ui/lib/theme-chalk/base.css import element-ui/lib/theme-chalk/dialog.cssVue.use(Dialog)基礎使用 <template><…

摩爾定律,梅特卡夫定律,吉爾德定律

信息系統的三大定律(摩爾定律&#xff0c;梅特卡夫定律&#xff0c;吉爾德定律)有一個清晰的視角&#xff1a; 信息系統不是左邊的生產消費系統&#xff0c;而是右邊的交易系統&#xff0c;交易系統與生產消費典型的區別在于信息交易過程會產生新的信息&#xff0c;就像錢一樣…

c語言——俄羅斯方塊

一、游戲效果 俄羅斯方塊 二. 游戲背景 俄羅斯方塊是久負盛名的游戲&#xff0c;它也和貪吃蛇&#xff0c;掃雷等游戲位列經典游戲的?列。 《俄羅斯方塊》&#xff08;Tetris&#xff0c;俄文&#xff1a;Тетрис&#xff09;是一款由俄羅斯人阿列克謝帕基特諾夫于1984…

java http

超文本傳輸協議 超文本/html 工作方式 get / url 請求獲取相應報文 http://xxxxxxxxxxxx.com/user?xxx xxx 協議類型 - 服務器地址 -路徑 path 請求格式: head / body path路徑進行處理資源 等同于報文請求: GET: /users HTTP/1.1 Host:api.github.com 響應報文 請求方式…

京東數據分析平臺(京東運營數據采集):2023年10月京東白酒品牌銷售排行榜

鯨參謀監測的京東平臺10月份白酒市場銷售數據已出爐&#xff01; 鯨參謀數據顯示&#xff0c;10月份&#xff0c;京東平臺上白酒的銷量為340萬&#xff0c;環比增長約16%&#xff0c;同比增長約37%&#xff1b;銷售額為28億&#xff0c;環比增長約20%&#xff0c;同比增長約122…

educoder中Hive綜合應用案例 — 學生成績查詢

第1關:計算每個班的語文總成績和數學總成績 ---------- 禁止修改 ----------drop database if exists mydb cascade;set hive.auto.convert.join = false; set hive.ignore.mapjoin.hint=false; ---------- 禁止修改 ---------- ---------- begin ---------- ---創建mydb數據…

如何在Ubuntu的Linux系統中安裝MySQL5.7數據庫

前往MySQL數據庫官網鏈接地址下載5.7數據庫。 MySQL :: Download MySQL Community Server (Archived Versions)使用ssh的可視化工具將下載的mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz文件上傳到Linux服務器&#xff0c;并解壓文件 tar -zxvf mysql-5.7.40-linux-glibc2.12-x…

總結vue框架中的鉤子函數

vue2.x生命周期鉤子函數 組件的生命周期分為3個階段: 掛載階段:beforeCreate、created、beforeMount、mounted,更新階段:beforeUpdate、updated,銷毀階段:beforeDestroy、destroyed beforeCreate beforeCreate() {// 初始化數據&#xff0c;并通過Object.defineProperty()和…

基于蛇優化算法優化概率神經網絡PNN的分類預測 - 附代碼

基于蛇優化算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于蛇優化算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于蛇優化優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神經網絡…

大數據預處理技術

文章目錄 前言 大數據技術成為前沿專業 也是現在甚至未來的朝陽產業&#xff0c;大數據有分別是 數據預處理 數據存儲 大數據處理和分析 數據可視化 部分組成 &#xff0c;大數據行業有數據則稱王&#xff0c;大數據的核心是數據本身 怎么獲取有價值的數據呢&#xff1f;本章講…

android 9 adb安裝過程學習(二)

一、PackageInstalllerService流程分析 下面來分析下 PackageInstallerService 中的邏輯&#xff0c;我們先來看看 PackageInstallerService 的創建&#xff0c;當然&#xff0c;這部分的邏輯是在開機的時候&#xff0c;這里我們再回顧下&#xff1a; 位置&#xff1a;./frame…

Cent OS 8.2 安裝 自定義硬盤 固定IP VMware

時間&#xff1a;20231122 環境&#xff1a;win11 、VMware 16 pro、Cent OS 8.2 說明&#xff1a;自定義安裝方法、自定義硬盤分區、固定IP且能聯網 1、使用自定義的方式安裝虛擬機 此處選擇典型&#xff0c;則會自動安裝系統&#xff0c;無法自定義硬件以及配置信息 選擇…

CCF CSP認證 歷年題目自練Day49

題目一 此題用暴力枚舉做過&#xff08;80分&#xff09;現如今終于用二維前綴和做到滿分。 試題編號&#xff1a; 202309-2 試題名稱&#xff1a; 坐標變換&#xff08;其二&#xff09; 時間限制&#xff1a; 2.0s 內存限制&#xff1a; 512.0MB 問題描述&#xff1a; 問題…

【Axure視頻教程】中繼器首行函數

今天教大家在Axure里如何使用中繼器首行函數&#xff0c;本視頻教程會先從中繼器首行函數的基礎講起&#xff0c;然后通過計算合計數、統計選中數、兩個中繼器選項聯動這3個案例更加深入的講解這這個函數的應用。注&#xff1a;該教程主要講解中繼器首行函數的用法&#xff0c;…

NFC:應用場景廣泛的短距離通信技術

NFC&#xff1a;應用場景廣泛的短距離通信技術 一、NFC 技術介紹1.1 NFC 技術應用場景1.2 NFC 技術優點1.3 NFC 工作原理 二、NFC 開發2.1 NFC 應用開發流程2.2 NFC 讀取和寫入2.3 NFC 讀寫功能示例 三、總結 一、NFC 技術介紹 NFC &#xff08;Near-field communication&…

SM系列國密算法

一、概述 國產密碼算法&#xff08;國密算法&#xff09;是指國家密碼局認定的國產商用密碼算法&#xff0c;國密算法是提升國家密碼安全和數據安全的關鍵技術。 為了保障商用密碼的安全性&#xff0c;國家密碼局制定了一系列密碼標準&#xff0c;包括&#xff1a;SM1、SM2、S…

分類預測 | Matlab實現基于PSO-PNN粒子群算法優化概率神經網絡的數據分類預測

分類預測 | Matlab實現基于PSO-PNN粒子群算法優化概率神經網絡的數據分類預測 目錄 分類預測 | Matlab實現基于PSO-PNN粒子群算法優化概率神經網絡的數據分類預測分類效果基本描述程序設計參考資料 分類效果 基本描述 1.Matlab實現基于PSO-PNN粒子群算法優化概率神經網絡的數據…