滑動窗口(3)—無重復字符的最長子串

文章目錄

  • 題目解析
    • 方法一:滑動窗口
    • 解法二(暴?求解)(不會超時,可以通過):
    • 附Java代碼

力扣題目:無重復字符的最長子串

題目解析

方法一:滑動窗口

思路和算法

我們先用一個例子考慮如何在較優的時間復雜度內通過本題。

我們不妨以示例一中的字符串 abcabcbb 為例,找出從每一個字符開始的,不包含重復字符的最長子串,那么其中最長的那個字符串即為答案。對于示例一中的字符串,我們列舉出這些結果,其中括號中表示選中的字符以及最長的字符串:
以 (a)bcabcbb 開始的最長字符串為 (abc)abcbb;
以 a(b)cabcbb 開始的最長字符串為 a(bca)bcbb;
以 ab?abcbb 開始的最長字符串為 ab(cab)cbb;
以 abc(a)bcbb 開始的最長字符串為 abc(abc)bb;
以 abca(b)cbb 開始的最長字符串為 abca(bc)bb;
以 abcab?bb 開始的最長字符串為 abcab(cb)b;
以 abcabc(b)b 開始的最長字符串為 abcabc(b)b;
以 abcabcb(b) 開始的最長字符串為 abcabcb(b)。
發現了什么?如果我們依次遞增地枚舉子串的起始位置,那么子串的結束位置也是遞增的!這里的原因在于,假設我們選擇字符串中的第 k 個字符作為起始位置,并且得到了不包含重復字符的最長子串的結束位置為 r
k
。那么當我們選擇第 k+1 個字符作為起始位置時,首先從 k+1 到 r
k
的字符顯然是不重復的,并且由于少了原本的第 k 個字符,我們可以嘗試繼續增大 r
k
?
,直到右側出現了重復字符為止。
這樣一來,我們就可以使用「滑動窗口」來解決這個問題了
我們使用兩個指針表示字符串中的某個子串(或窗口)的左右邊界,其中左指針代表著上文中「枚舉子串的起始位置」,而右指針即為上文中的 r
k
在每一步的操作中,我們會將左指針向右移動一格,表示 我們開始枚舉下一個字符作為起始位置,然后我們可以不斷地向右移動右指針,但需要保證這兩個指針對應的子串中沒有重復的字符。在移動結束后,這個子串就對應著 以左指針開始的,不包含重復字符的最長子串。我們記錄下這個子串的長度;

在枚舉結束后,我們找到的最長的子串的長度即為答案。

判斷重復字符

在上面的流程中,我們還需要使用一種數據結構來判斷 是否有重復的字符,常用的數據結構為哈希集合(即 C++ 中的 std::unordered_set,Java 中的 HashSet,Python 中的 set, JavaScript 中的 Set)。在左指針向右移動的時候,我們從哈希集合中移除一個字符,在右指針向右移動的時候,我們往哈希集合中添加一個字符。

至此,我們就完美解決了本題。

class Solution {
public:int lengthOfLongestSubstring(string s) {// 哈希集合,記錄每個字符是否出現過unordered_set<char> occ;int n = s.size();// 右指針,初始值為 -1,相當于我們在字符串的左邊界的左側,還沒有開始移動int rk = -1, ans = 0;// 枚舉左指針的位置,初始值隱性地表示為 -1for (int i = 0; i < n; ++i) {if (i != 0) {// 左指針向右移動一格,移除一個字符occ.erase(s[i - 1]);}while (rk + 1 < n && !occ.count(s[rk + 1])) {// 不斷地移動右指針occ.insert(s[rk + 1]);++rk;}// 第 i 到 rk 個字符是一個極長的無重復字符子串ans = max(ans, rk - i + 1);}return ans;}
};

解法二(暴?求解)(不會超時,可以通過):

 class Solution {public:int lengthOfLongestSubstring(string s) {int ret = 0; 
int n = s.length();
for (int i = 0; i < n; i++){int hash[128] = { 0 };for (int j = i; j < n; j++){hash[s[j]]++; if (hash[s[j]] > 1) break;      ret = max(ret, j - i + 1);}}return ret;}};

附Java代碼

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 個字符是一個極長的無重復字符子串ans = Math.max(ans, rk - i + 1);}return ans;}
}

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

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

相關文章

C++字符串操作詳解

引言 字符串處理是編程中最常見的任務之一&#xff0c;而在C中&#xff0c;我們有多種處理字符串的方式。本文將詳細介紹C中的字符串操作&#xff0c;包括C風格字符串和C的string類。無論你是C新手還是想鞏固基礎的老手&#xff0c;這篇文章都能幫你梳理字符串處理的關鍵知識點…

Vulhub-DC-4靶場通關攻略

下載地址&#xff1a;https://www.vulnhub.com/entry/dc-4,313/ 掃描IP地址 arp-sacn -l掃描端口&#xff0c;開啟了80和22端口 nmap -p- 192.168.112.140訪問80端口 掃描目錄&#xff0c;并沒有發現敏感目錄 嘗試爆破 爆破成功&#xff0c;用戶名admin 密碼happy 登錄成功 …

OfficePlus去掉PDF文件右鍵菜單里的PDF轉換

今天在吾愛破解論壇看到一個求助帖&#xff0c;說是OfficePlus&#xff0c;安裝后&#xff0c;PDF文件的右鍵菜單里多了PDF轉換&#xff0c;想去掉&#xff0c;不知道怎么弄。底下的回復基本都是百度復制或者AI搜索出的答案&#xff0c;大致就是找注冊表里CLASSID下的菜單欄相關…

大模型本地部署系列(3) Ollama部署QwQ[阿里云通義千問]

大家好&#xff0c;我是AI研究者&#xff0c; 今天教大家部署 一個阿里云通義千問大模型。 QwQ大模型簡介 QwQ是由阿里云通義千問&#xff08;Qwen&#xff09;團隊推出的開源推理大模型&#xff0c;專注于提升AI在數學、編程和復雜邏輯推理方面的能力。其核心特點包括&#x…

微信小程序學習實錄12:掌握大數據量軌跡展示的MySQL結構設計

獲取經緯度信息后&#xff0c;mysql建立數據表po_trajectory&#xff0c;字段包含tra_id、longitude、latitude、tra_time和openid。 為微信小程序創建的 po_trajectory 數據表&#xff0c;字段包含 tra_id、longitude、latitude、tra_time 和 openid&#xff0c;從結構設計上…

計算機系統---性能指標(3)續航與散熱

計算機電池續航的性能指標 一、電池基礎物理指標 電池容量&#xff08;核心指標&#xff09; 單位&#xff1a; 毫安時&#xff08;mAh&#xff09;&#xff1a;常見于手機/平板&#xff0c;反映電池存儲電荷量&#xff0c;需結合電壓計算實際能量&#xff08;如3.7V電池&…

貪心算法之最小生成樹問題

1. 貪心算法的基本思想 貪心算法在每一步都選擇局部最優的邊&#xff0c;希望最終得到整體最優的生成樹。常見的兩種 MST 算法為 Kruskal 算法 和 Prim 算法。這兩者均滿足貪心選擇性質和最優子結構性質&#xff0c;即&#xff1a; 貪心選擇性質&#xff1a;局部最優選擇&…

LeetCode hot 100—編輯距離

題目 給你兩個單詞 word1 和 word2&#xff0c; 請返回將 word1 轉換成 word2 所使用的最少操作數 。 你可以對一個單詞進行如下三種操作&#xff1a; 插入一個字符刪除一個字符替換一個字符 示例 示例 1&#xff1a; 輸入&#xff1a;word1 "horse", word2 &q…

2.3 Spark運行架構與流程

Spark運行架構與流程包括幾個核心概念&#xff1a;Driver負責提交應用并初始化作業&#xff0c;Executor在工作節點上執行任務&#xff0c;作業是一系列計算任務&#xff0c;任務是作業的基本執行單元&#xff0c;階段是一組并行任務。Spark支持多種運行模式&#xff0c;包括單…

NO.82十六屆藍橋杯備戰|動態規劃-從記憶化搜索到動態規劃|下樓梯|數字三角形(C++)

記憶化搜索 在搜索的過程中&#xff0c;如果搜索樹中有很多重復的結點&#xff0c;此時可以通過?個"備忘錄"&#xff0c;記錄第?次搜索到的結果。當下?次搜索到這個結點時&#xff0c;直接在"備忘錄"??找結果。其中&#xff0c;搜索樹中的?個?個結點…

使用 VBA 宏創建一個選擇全部word圖片快捷指令,進行圖片格式編輯

使用 VBA 宏批量選擇圖片 ? 第一步&#xff1a;創建 .dotm 加載項文件 1、使用環境 office word 365&#xff0c;文件格式為.docx 圖片格式為.PNG 2、創建 .dotm 加載項文件 打開 Word&#xff0c;新建一個空白文檔。 按下 Alt F11 打開 VBA 編輯器。 點擊菜單欄&#xff…

深度學習的下一個突破:從圖像識別到情境理解

引言 過去十年&#xff0c;深度學習在圖像識別領域取得了驚人的突破。從2012年ImageNet大賽上的AlexNet&#xff0c;到后來的ResNet、EfficientNet&#xff0c;再到近年來Transformer架構的崛起&#xff0c;AI已經能在許多任務上超越人類&#xff0c;比如人臉識別、目標檢測、醫…

使用dyn4j做碰撞檢測

文章目錄 前言一、環境準備添加依賴基本概念 二、實現步驟1.創建世界2.添加物體3.設置碰撞監聽器4.更新世界 三、完整代碼示例四、優化補充總結 前言 dyn4j 提供了高效的碰撞檢測和物理模擬功能&#xff0c;適用于游戲開發、動畫制作以及其他需要物理交互的場景。通過簡單的 A…

VS Code settings.json 文件中常用的預定義變量?及其用途說明

VS Code settings.json 常用預定義變量 以下是 Visual Studio Code 配置文件中常用的預定義變量列表&#xff1a; 1. 工作區相關變量 變量描述示例值${workspaceFolder}當前工作區根目錄的絕對路徑C:/projects/my-project${workspaceFolderBasename}工作區文件夾名稱&#x…

elasticSearch-搜索引擎

搜索引擎的優勢 有了數據庫分頁查詢&#xff0c;為什么還需要搜索引擎&#xff1f; 搜索引擎速度上很快數據庫分頁查詢&#xff0c;隨著數據庫數據量增大&#xff0c;頁數靠后&#xff0c;會導致搜索速度變慢&#xff0c;但是搜索引擎不會搜索引擎支持分詞查詢&#xff0c;地…

安裝OpenJDK1.8 17 (macos M芯片)

安裝OpenJDK 1.8 下載完后&#xff0c;解壓&#xff0c;打開 環境變量的配置文件即可 vim ~/.zshrc #export JAVA_HOME/Users/xxxxx/jdk-21.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-17.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-11.jdk/Contents…

斷言與反射——以golang為例

斷言 x.(T) 檢查x的動態類型是否是T&#xff0c;其中x必須是接口值。 簡單使用 func main() {var x interface{}x 100value1, ok : x.(int)if ok {fmt.Println(value1)}value2, ok : x.(string)if ok {//未打印fmt.Println(value2)} }需要注意如果不接受第二個參數就是OK,這…

Java設計模式:系統性解析與核心模式

一、設計模式三大分類總覽 創建型模式&#xff08;5種&#xff09; 核心目標&#xff1a;對象創建的優化與解耦 單例模式&#xff08;Singleton&#xff09; 工廠模式&#xff08;Factory&#xff09; 抽象工廠模式&#xff08;Abstract Factory&#xff09; 建造者模式&#…

Elasticsearch 向量數據庫,原生支持 Google Cloud Vertex AI 平臺

作者&#xff1a;來自 Elastic Valerio Arvizzigno Elasticsearch 將作為第一個第三方原生語義對齊引擎&#xff0c;支持 Google Cloud 的 Vertex AI 平臺和 Google 的 Gemini 模型。這使得聯合用戶能夠基于企業數據構建完全可定制的生成式 AI 體驗&#xff0c;并借助 Elastics…

408 計算機網絡 知識點記憶(7)

前言 本文基于王道考研課程與湖科大計算機網絡課程教學內容&#xff0c;系統梳理核心知識記憶點和框架&#xff0c;既為個人復習沉淀思考&#xff0c;亦希望能與同行者互助共進。&#xff08;PS&#xff1a;后續將持續迭代優化細節&#xff09; 往期內容 408 計算機網絡 知識…