【力扣】無重復字符的最長子串,滑動窗口 + 哈希集合

無重復字符的最長子串原題地址

方法一:滑動窗口(雙指針) + 哈希集合

考慮找出字符串s的所有的無重復字符的子串,求出這些子串長度的最大值即可。

使用下標 [left,right] 來維護子串。我們只需要找到每一個 left 對應的所有 right 即可,換句話說,固定了 left 之后,我們讓 right 從 left?的位置開始,向后滑動,直到 [left,right] 出現重復字符為止。

以下為所有無重復字符的子串:

(a) b c a b c b b
(a b) c a b c b b
(a b c) a b c b b
a (b) c a b c b b
a (b c) a b c b b
a (b c a) b c b b
a b (c) a b c b b
a b (c a) b c b b
a b (c a b) c b b
a b c (a) b c b b
a b c (a b) c b b
a b c (a b c) b b
a b c a (b) c b b
a b c a (b c) b b
a b c a b (c) b b
a b c a b (c b) b
a b c a b c (b) b
a b c a b c b (b)

由于我們要找的是這些子串中最長的那個,所以固定 left 后,先讓 right 右移至出現重復字符或者 right 移動到字符串的末尾,再統計該子串的長度,即 right-left+1 ,求出其中的最大值即可。

需要統計如下子串的長度:

(a b c) a b c b b
a (b c a) b c b b
a b (c a b) c b b
a b c (a b c) b b
a b c a (b c) b b
a b c a b (c b) b
a b c a b c (b) b
a b c a b c b (b)

顯然,當某條子串 [left,right] 的右端點 right 已經到達字符串的末尾時,若 left 繼續右移,只會縮短子串長度,所以此時無需繼續統計

為了判斷子串是否已經出現重復字符,可以利用哈希集合(如?C++ 中的 unordered_set<char> ),來存儲 [left,right] 中的所有字符,當 right 右移時,就把最右邊的字符添加到哈希集合中;當 left 右移時,就把最左邊的字符從哈希集合中刪除。這樣,每次只需判斷子串新增加的字符是否已經在哈希集合中出現過即可。

// 方法一:滑動窗口
class Solution
{
public:int lengthOfLongestSubstring(string s){if (s.empty()){return 0;}unordered_set<char> us;int ans = 0;// [left,right] 表示子串int left = 0, right = 0;us.insert(s[0]);while (1){// 右指針右移,直到出現重復字符while (right + 1 < s.size() && !us.count(s[right + 1])){us.insert(s[++right]);}// 子串長度為 right-left+1ans = max(ans, right - left + 1);// 右指針走到尾,子串不可能更長if (right == s.size() - 1){break;}// 左指針右移,在哈希表中去掉最左邊的字符us.erase(s[left++]);}return ans;}
};

方法二:對方法一的優化,實現左指針 left 的快速跳轉

方法一是固定 left ,讓 right 盡可能右移,從而統計所有的 [left,right] 區間長度 right-left+1 的最大值,這樣最壞情況下 left 會遍歷完整個字符串。

考慮用 key-value 模型的哈希表(如?C++ 中的 unordered_set<char, int> ),每次把 [0,right] 的字符及其對應下標都存進去。

我們用 right 遍歷字符串,若 right 右移后指向的字符在哈希表中出現過,且最后出現的下標在 [left,right] 的范圍內,說明此時的子串 [left,right] 已經出現了重復字符,此時 left 應該跳轉到 s[right] 最后一次出現的位置的后面

下面的例子中, right 本來指向 f ,右移后指向 c , left 就要從 a 直接跳轉到第一個 c 后面,否則 [left,right] 會出現重復字符。

(a b c d e f) c
a b c (d e f c)

每次 right 右移后,都要把 s[right] 及對應的下標 right 都存儲到哈希表中,也就是把 s[right] 當前最后出現的位置存儲到哈希表中。

// 方法二:滑動窗口優化
class Solution
{
public:int lengthOfLongestSubstring(string s){if (s.size() <= 1){return s.size();}unordered_map<char, int> um;int ans = 0;// [left,right] 表示子串int left = 0, right = 0;um[s[0]] = 0;// 右指針右移,直到出現重復字符while (++right < s.size()){auto it = um.find(s[right]);// 出現重復字符if (it != um.end()){// 左指針跳轉到重復字符上一次出現的位置之后left = max(left, it->second + 1);}// 子串長度為 right-left+1ans = max(ans, right - left + 1);um[s[right]] = right;}return ans;}
};

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

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

相關文章

php PhpSpreadsheet 讀取日期變數字問題解決

問題描述&#xff1a; 使用PhpSpreadsheet 讀取表格數據&#xff0c;日期格式讀取后變成數字&#xff0c;如下圖&#xff1a; 解決方案&#xff1a; $cell $sheet->getCell(H . $row)->getValue(); $toTimestamp \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimes…

騰軒科技傳媒探討網絡整合營銷推廣的策略和效果

在當今高度信息化的商業環境中&#xff0c;整合營銷推廣&#xff08;IMC&#xff09;已經成為了品牌營銷策略的核心。它旨在通過多種渠道和平臺&#xff0c;將一致、連貫的品牌信息傳達給目標受眾&#xff0c;從而增強品牌知名度和忠誠度。騰軒科技傳媒將深入探討整合營銷推廣的…

【airtest】自動化入門教程(一)AirtestIDE

目錄 一、下載與安裝 1、下載 2、安裝 3、打開軟件 二、web自動化配置 1、配置chrome瀏覽器 2、窗口勾選selenium window 三、新建項目&#xff08;web&#xff09; 1、新建一個Airtest項目 2、初始化代碼 3、打開一個網頁 四、恢復默認布局 五、新建項目&#xf…

模擬算法題練習(一)

模擬算法介紹&#xff1a; 模擬算法通過模擬實際情況來解決問題&#xff0c;一般容易理解但是實現起來比較復雜&#xff0c;有很多需要注意的細節&#xff0c;或者是一些所謂很“麻模“的東西。 模擬題一般不涉及太難的算法&#xff0c;一般就是由較多的簡單但是不好處理的部…

【算法】最小生成樹—Prim算法與Kruskal算法

Prim算法和Kruskal算法都是解決最小生成樹問題的經典算法。最小生成樹是原圖的最小連通子圖&#xff0c;它包含原圖的全部結點&#xff0c;且保持圖連通的所有邊代價和最小。一個連通圖可能有多個最小生成樹。 一、Prim算法 含義 Prim算法&#xff0c;也被稱為普里姆算法&…

基于移動端的食堂助餐在線點餐配送系統 uniapp微信小程序

本文從管理員、老人、配送員、食堂商家的功能要求出發&#xff0c;養老助餐管理系統小程序中的功能模塊主要是實現老人、配送員、食堂商家、食堂大廳、預約選座、餐號信息、美食信息、美食訂單、訂單信息、訂單配送、訂單評價、老人食堂、下單信息、飲食分析。經過認真細致的研…

C語言可以干些什么?C語言主要涉及哪些IT領域?

C語言可以干些什么&#xff1f;C語言主要涉及哪些IT領域&#xff1f; 在開始前我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「C語言的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家…

我在爭什么?

本來想寫一下2024項目部人員該怎么干&#xff0c;還沒有寫出來&#xff0c;大家內部就先動起來。針對現有情況做了分析&#xff1a; 作為項目人員&#xff08;實施&#xff0c;運維&#xff09; 需要有一定自我認識 認識清楚公司要什么&#xff1f; 認識清楚我自己要什么&…

內網安裝redis+部署redis-cluster集群

一、安裝redis redis安裝包下載地址&#xff1a; https://download.redis.io/releases/ 1.1 解壓編譯并創建數據目錄 tar xzvf redis-6.2.10.tar.gz -C /usr/local/ cd /usr/local/ mv redis-6.2.10/ redis cd /usr/local/redis/ make #編譯 …

Springboot整合SSE實現實時消息推送

SSE詳細介紹傳送門&#xff1a;SSE實時消息推送 簡單描述一下SSE推送在實際項目中應用的常見場景 1&#xff0c;項目頁面中有消息通知板塊&#xff0c;當信息有變化時&#xff0c;只有手動刷新頁面&#xff0c;才會看到最新的數據&#xff0c;這里可以采用SSE技術實時推送最新…

Docker技術概論(1):Docker與虛擬化技術比較

Docker技術概論&#xff08;1&#xff09; Docker與虛擬化技術比較 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

深入解析Android-AutoLayout,2024安卓開發面試題及答案

前言 如果你也學習Android&#xff0c;那么你大概率會看過我的文章。經常有讀者給我留言&#xff1a;“該怎么學習Android&#xff1f;”、“日常學習Android的方法是什么”。 所以&#xff0c;今天&#xff0c;我將獻上一份《Android知識圖譜》&#xff0c;以自身的經驗 &…

ABAP 發送帶EXCEL郵件

前言 沒啥特殊需求&#xff0c;就是有個庫齡報表用戶想整郵件發送 實現 用的最簡單的XLS文件作為excel附件發送出去 觀察XLS文件的純文本格式&#xff0c;每列之間用TAB制表符分隔&#xff0c;每行之間用回車符分隔 思路也比較明確&#xff0c;在SAP中實現這種格式&#xf…

.Net利用Microsoft.Extensions.DependencyInjection配置依賴注入

一、概述 為了讓接口程序更加模塊化和可測試,采用依賴注入的方式調用接口方法。 二、安裝Microsoft.Extensions.DependencyInjection 在NuGet里面搜索Microsoft.Extensions.DependencyInjection,并進行安裝。 三、代碼編寫 3.1 創建Service 實現類 /*****************…

【跨境電商須知】FP獨立站的特點和痛點有哪些?

無論是做獨立站&#xff0c;還是做亞馬遜&#xff0c;都有各自的難點。自己做獨立站若要在跨境行業長足發展&#xff0c;既要知道FP獨立站有什么特點&#xff0c;要清楚FP獨立站的痛點并一一克服。 一、FP獨立站的特點 與依賴第三方平臺相比&#xff0c;擁有自己的域名、服務器…

Doccano 修復 spacy.gold 的bug

引言 最初只是想把Doccano標注的數據集轉換成BIO(類似conll2003數據集)的標注格式&#xff1b; 摘要 可先閱讀一下教程&#xff1a;【已解決】關于如何將Doccano標注的文本轉換成NER模型可以直接處理的CoNLL 2003格式 裝包:pip install doccano-transformer 報錯信息 運行…

Adam優化算法

Adam算法&#xff08;Adaptive Moment Estimation&#xff09;是一種用于深度學習模型優化的算法&#xff0c;它結合了動量&#xff08;Momentum&#xff09;和RMSprop&#xff08;Root Mean Square Propagation&#xff09;的概念。Adam算法自2015年提出以來&#xff0c;因其高…

【前端素材】推薦優質后臺管理系統DAdmin平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理網站、應用程序或系統的管理界面&#xff0c;通常由管理員和工作人員使用。它提供了訪問和控制網站或應用程序后臺功能的工具和界面&#xff0c;使其能夠管理用戶、內容、數據和其他各種功能。 2、功能需求 后臺管理系…

FreeCAD|讀取STEP、創建平面、相交、瓶子

FreeCAD是一個基于OpenCASCADE的開源CAD/CAE工具。OpenCASCADE是一套開源的CAD/CAM/CAE幾何模型核心&#xff0c;來自法國Matra Datavision公司&#xff0c;是著名的CAD軟件EUCLID的開發平臺。FreeCAD可運行于Windows以及Linux系統環境下&#xff0c;是一種通用的3D CAD建模工具…

記錄 關于navicat連接數據庫報錯1045的問題

重裝數據庫之后就連接不上了 報錯1045 而網上的解決方案大都是更改數據庫密碼&#xff0c;但是我在第一步就被卡住無法更改密碼&#xff0c;輸入指令也報錯&#xff0c;檢查的環境變量也沒錯&#xff0c;經過長時間的試錯終于找到解決了辦法 解決辦法 刪除data文件夾 如果無法…