(2)滑動窗口算法練習:無重復字符的最長子串

無重復字符的最長子串

題目鏈接:3. 無重復字符的最長子串 - 力扣(LeetCode)

給定一個字符串 s ,請你找出其中不含有重復字符的最長子串的長度。

輸入: s = "abcabcbb"

輸出: 3

解釋: 因為無重復字符的最長子串是"abc",所以其長度為 3。

思路解析:

本題的暴力解法為兩層for循環遍歷+hash判斷是否重復,時間復雜度為O(N^2),根據暴力解法可以進一步優化將時間復雜度降低到O(N)

以示例數組為例

正向性:定義一個left和一個right指針,二者指向第一個字符。在遍歷的過程中,right指針向右移動,直到遇到一個已經出現的字符停止,此時right指針是否需要回退呢?答案是不需要,因為當right指針遇到已經出現過的字符后,left指針就會開始移動,如果left++,則下一個字符為b,此時在區間(left=1)[left, right]中不存在已經重復的字符,因為已經跳過了重復的字符a。所以,left指針和right指針在移動的過程中均滿足從左向右移動不回退

在上面的示例中,重復字符為第一個字符,考慮示例:s="deabcabcbb"。在該示例中,right向右移動一直到第二個字符a,此時[left, right]中存在重復字符a,停止移動right,接下來移動left,那么left是否需要一次只移動1個長度呢?不需要,原因很簡單,left++后下一個區間(left=1)[left, right]起始字符為e,而對應區間中的子串為eabca,仍然存在重復字符a,所以left在移動時并不是每一次都只移動1個長度(即只循環一次),只需要讓left移動到當前區間第一個重復字符的下一個字符b的位置即可,所以需要使用循環來讓left一直移動直到跳過重復字符

對于哈希表的處理,不需要使用庫中的結構,因為題目中給出了結果s的取值只會出現英文字母、數字、符號和空格,所以只需要定義一個長度為128的數組即可,對應的下標即為對應字符的ASCII碼值

根據上面的分析,因為leftright在遍歷的過程中不需要回退,所以可以考慮使用滑動窗口算法解決,步驟如下:

  1. 進窗口:本題進窗口意味著只要元素沒有在哈希表數組中就進入哈希表數組

  2. 判斷:因為遇到重復的字符right就停止移動,所以當哈希表數組字符ASCII值下標對應的元素不為0即代表重復,作為判斷條件

  3. 出窗口:出窗口則意味著已經在哈希表中的元素需要離開哈希表,并讓left向后移動,需要注意的是,因為需要進入一個新的窗口,所以出窗口時需要使left位置的字符對應哈希數組下標值的元素出現的次數改變

  4. 更新結果:本題更新結果只需要在[left, right]區間沒有重復字符后即可,用變量len存儲子串長度,再移動right

具體步驟如下:

參考代碼:

class Solution {
public:int lengthOfLongestSubstring(string s) {int hash[128] = {0}; // 創建hash表int len = 0;for(int left = 0, right = 0; right < s.size(); right++){hash[s[right]]++; // 標記已經出現// 判斷while(hash[s[right]] > 1){hash[s[left++]]--;// 出窗口}len = max(len, right - left + 1);// 更新結果}return len;}
};

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

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

相關文章

mov視頻怎么改成mp4?把mov改成MP4的四個方法

mov視頻怎么改成mp4&#xff1f;選擇合適的視頻格式對于確保內容質量和流通性至關重要。盡管蘋果公司的mov格式因其出色的視頻表現備受贊譽&#xff0c;但在某些情況下&#xff0c;它并非最佳選擇&#xff0c;因為使用mov格式可能面臨一些挑戰。MP4格式在各種設備&#xff08;如…

構造二進制字符串

目錄 LeetCode3221 生成不含相鄰零的二進制字符串 #include <iostream> #include <vector> using namespace std;void dfs(string s,int n,vector<string>& res){if(s.size()n){res.push_back(s);return;}dfs(s"0",n,res);dfs(s"1"…

使用redis進行短信登錄驗證(驗證碼打印在控制臺)

使用redis進行短信登錄驗證 一、流程1. 總體流程圖2. 流程文字講解&#xff1a;3.代碼3.1 UserServiceImpl&#xff1a;&#xff08;難點&#xff09;3.2 攔截器LoginInterceptor&#xff1a;3.3 攔截器配置類&#xff1a; 4 功能實現&#xff0c;成功存入redis &#xff08;黑…

搜維爾科技為空氣分離、氫氣、石化和天然氣工廠的現場操作員提供虛擬現實(VR)培訓

搜維爾科技為空氣分離、氫氣、石化和天然氣工廠的現場操作員提供虛擬現實(VR)培訓 搜維爾科技為空氣分離、氫氣、石化和天然氣工廠的現場操作員提供虛擬現實(VR)培訓

python 中關于append和extend的區別用法

#方法1 d[1,2,[3,4]] c[] for i in d:if type(i) int:c.append(i)else:c.extend(i)# append方法用于將單個元素添加到列表的末尾&#xff0c;這意味著無論元素是什么類型# &#xff08;如整數、字符串等&#xff09;&#xff0c;它都將作為一個獨立的元素添加到列表中。# exten…

UE5.2 AI實時摳像(無需綠幕) + OBS推流直播 全流程

最近通過2個UE5.2插件實現了從AI實時摳像到OBS推流的直播流程搭建&#xff0c;也為了水一篇博客&#xff0c;就在這里記錄一下了&#xff0c;覺得沒有意思的朋友&#xff0c;這里先說為敬了。 具體教程參考&#xff1a;【UE5 AI摳像OBS推流全流程&#xff08;簡單免費&#xf…

華為機考真題 -- 尋找身高相近的小朋友

題目描述: 小明今年升學到z小學—年級,來到新班級后發現其他小朋友們身高參差不齊,然后就想基于各4朋友和自己的身高差q對他們進行排序,請幫他實現排序。 輸入描述: 有一行為正整數h和n,0<h<200,為小明的身高,0<n<50,為新班級其他小朋友個數。 第二行為…

java中 使用數組實現需求小案例

Date: 2024.04.08 18:32:57 author: lijianzhan 需求實現&#xff1a; 設計一個java類&#xff0c;java方法&#xff0c;根據用戶手動輸入的績點&#xff0c;從而獲取到績點最高的成績。 實現業務邏輯的代碼塊 import java.util.Scanner;public class PointDemo {/*** 需求&…

Spring相關面試題(四)

49 JavaConfig方式如何啟用AOP?如何強制使用cglib&#xff1f; 在JavaConfig類&#xff0c;加上EnableAspectJAutoProxy 如果要強制使用CGLIB動態代理 &#xff0c;加上(proxyTargetClass true) 加上(exposeProxy true) 就是將對象暴露到線程池中。 50 介紹AOP在Spring中…

【3】遷移學習模型

【3】遷移學習模型 文章目錄 前言一、安裝相關模塊二、訓練代碼2.1. 管理預訓練模型2.2. 模型訓練代碼2.3. 可視化結果2.4. 類別函數 總結 前言 主要簡述一下訓練代碼 三葉青圖像識別研究簡概 一、安裝相關模塊 #xingyun的筆記本 print(xingyun的筆記本) %pip install d2l %…

詳解TCP和UDP通信協議

目錄 OSI的七層模型的主要功能 tcp是什么 TCP三次握手 為什么需要三次握手&#xff0c;兩次握手不行嗎 TCP四次揮手 揮手會什么需要四次 什么是TCP粘包問題&#xff1f;發生的原因 原因 解決方案 UDP是什么 TCP和UDP的區別 網絡層常見協議 利用socket進行tcp傳輸代…

【js面試題】深入理解DOM操作:創建、查詢、更新、添加和刪除節點

面試題&#xff1a;DOM常見的操作有哪些 引言&#xff1a; 在前端開發中&#xff0c;DOM&#xff08;文檔對象模型&#xff09;操作是日常工作中不可或缺的一部分。DOM提供了一種以編程方式訪問和更新文檔內容、結構和樣式的接口。 任何html或 xml 文檔都可以用dom表示為一個由…

KIVY Button?

Button — Kivy 2.3.0 documentation Button Jump to API ? Module: kivy.uix.button Added in 1.0.0 The Button is a Label with associated actions that are triggered when the button is pressed (or released after a click/touch). To configure the button, the s…

【論文速讀】| 用于安全漏洞防范的人工智能技術

本次分享論文&#xff1a;Artificial Intelligence Techniques for Security Vulnerability Prevention 基本信息 原文作者&#xff1a;Steve Kommrusch 作者單位&#xff1a;Colorado State University, Department of Computer Science, Fort Collins, CO, 80525 USA 關鍵…

ISO/OSI七層模型

ISO:國際標準化/ OSI:開放系統互聯 七層協議必背圖 1.注意事項&#xff1a; 1.上三層是為用戶服務的&#xff0c;下四層負責實際數據傳輸。 2.下四層的傳輸單位&#xff1a; 傳輸層&#xff1b; 數據段&#xff08;報文&#xff09; 網絡層&#xff1a; 數據包&#xff08;報…

1Panel安裝命令腳本大全,多Linux操作系統版本

1Panel安裝命令腳本大全&#xff0c;包括RedHat、CentOS、Ubuntu、Debian和openEuler等linux操作系統&#xff0c;碼筆記整理1Panel安裝命令腳本清單&#xff1a; RedHat/CentOS安裝命令&#xff1a; curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh…

【Swoole 的生命周期,文件描述符,協程數量,以及默認值】

目錄 Swoole 的生命周期 Swoole 文件描述符&#xff08;FD&#xff09;緩存 Swoole設置協程的數量 Swoole 默認值 Swoole 是一個基于 PHP 的高性能網絡通信引擎&#xff0c;它采用 C 編寫&#xff0c;提供了協程和高性能的網絡編程支持。Swoole 支持多種網絡服務器和客戶端…

python庫 - modelscope

ModelScope 是一個集成的機器學習模型庫&#xff0c;旨在簡化機器學習模型的使用流程&#xff0c;提供多種預訓練模型&#xff0c;涵蓋計算機視覺、自然語言處理、語音識別等多個領域。用戶可以輕松訪問、使用和分享各種預訓練的機器學習模型&#xff0c;無需從頭開始訓練模型&…

Vue項目openlayers中使用jsts處理wkt和geojson的交集-(geojson來源zpi解析)

Vue項目openlayers中使用jsts處理wkt和geojson的交集-(geojson來源zpi解析) 讀取壓縮包中的shape看上一篇筆記&#xff1a;Vue項目讀取zip中的ShapeFile文件&#xff0c;并解析為GeoJson openlayers使用jsts官方示例&#xff1a;https://openlayers.org/en/latest/examples/j…

框選table單元格,高亮展示

td單元格內&#xff0c;有未知層dom結構 <style>.highlight {background-color: yellow;} </style> <table id"myTable"><colgroup><col style"background-color: lightblue;"><col style"background-color: light…