【力扣03】無重復字符的最長子串

題目

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

示例?1:

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

示例 2:

輸入: s = "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是?"wke",所以其長度為 3。請注意,你的答案必須是 子串 的長度,"pwke"?是一個子序列,不是子串。

滑動窗口技術

思路:


這道題主要用到思路是:滑動窗口

什么是滑動窗口?

其實就是一個隊列,比如例題中的 abcabcbb,進入這個隊列(窗口)為 abc 滿足題目要求,當再進入 a,隊列變成了 abca,這時候不滿足要求。所以,我們要移動這個隊列!

如何移動?

我們只要把隊列的左邊的元素移出就行了,直到滿足題目要求!

一直維持這樣的隊列,找出隊列出現最長的長度時候,求出解!

時間復雜度:O(n)

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:if not s:return 0left = 0lookup = set()n = len(s)max_len = 0cur_len = 0for i in range(n):cur_len += 1while s[i] in lookup:lookup.remove(s[left])left += 1cur_len -= 1if cur_len > max_len:max_len = cur_lenlookup.add(s[i])return max_len

這段代碼使用滑動窗口技術來找出字符串中最長的無重復字符子串的長度。以下是逐行解釋:

  1. if not s: return 0
    檢查輸入字符串是否為空,如果為空則直接返回0。

  2. left = 0
    初始化左指針left為0,表示當前窗口的起始位置。

  3. lookup = set()
    創建一個空集合lookup,用于記錄當前窗口中的字符。

  4. n = len(s)
    計算字符串s的長度,并賦值給變量n

  5. max_len = 0
    初始化最長子串長度max_len為0。

  6. cur_ len = 0
    初始化當前窗口長度cur_ len為0。

  7. for i in range(n):
    遍歷字符串中的每一個字符,索引為i

  8. cur_ len +=1
    進入循環后,先將當前窗口長度增加1,假設當前字符可以加入窗口。

  9. while s[i] in lookup:
    檢查當前字符s[i]是否已經在當前窗口中存在。如果存在,則需要調整窗口左邊界:

    a.?lookup.remove(s[left])
    移除集合中的左指針指向的字符,表示該字符不再屬于當前窗口。

    b.?left +=1
    將左指針向右移動一位,縮小窗口范圍。

    c.?cur_ len -=1
    由于移除了一個字符,當前窗口長度減1。

  10. if cur_ len > max_len: max_len = cur_ len
    檢查當前窗口長度是否為最大值,并更新max_len

  11. lookup.add(s[i])
    將當前字符s[i]添加到集合中,表示該字符已加入當前窗口。

  12. return max_len
    遍歷結束后,返回最長無重復子串的長度max_len

#include<string.h>  //首先額外引入一個新的字符串庫
int lengthOfLongestSubstring(char* s) {int len=strlen(s);  //得到字符串的長度int i = 0;      //i是循環變量,從第一個字符開始找最長的無重復字母的子串int result = 0; //result 為最后的返回的結果,求長度最長時,result至為0;求長度最短時,result至為INT32_MAXint count = 0;  //count 為每次循環的最長的無重復字母的子串的長度int b;  //b 為遞歸調用循環變量while (s[i]){int flag = 1;   //flag 為標志變量,首先至為1int j;  //里層循環的變量jfor (j = 0; j < i; j++){if (s[i] == s[j])//如果找到重復的的字母,那么就{flag = 0;   //標志變量至為0b = j;      //遞歸變量b賦值為j,即在子串的與s[i]重復的第一個字母break;      //跳出里層循環}}if (flag == 1)//如果遍歷了一遍,如果沒發現重復的字母,flag還是等于1{i++;     count++;    //子串的長度加1result = result > count ? result : count; //更新result的結果:count和原來result中最大的數}else{break;  //否則,退出外層循環}b = i;  //如果i=1時,s[i](即s[b],即s[1])和s[1]相同時,遞歸時直接往后移一位就行;;當i>1,也是從子串的與s[i]重復的第一個字母s[b]下一個字母————s[b+1]開始,}// 設置遞歸出口條件if (b+1<len) //注意不建議*(s+b+1),這樣算是空指針解引用,在力扣上報錯了,但在VS上沒報錯  //所以必須保證b+1<len{count = lengthOfLongestSubstring(s+b+1);result = result > count ? result : count;//必須要有這一步,否則也會出錯//將遞歸的結果與上級函數的result比較}return result;
}

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

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

相關文章

一文介紹阿里32B推理模型

什么是QwQ-32B&#xff1f; QwQ-32B并非普通的聊天機器人模型&#xff0c;而是推理模型。推理模型專注于邏輯拆解問題、分步推導&#xff0c;并輸出結構化答案。 通過下面的示例&#xff0c;我們可以直觀看到QwQ-32B的思考過程&#xff1a; qwq-32b思考過程 如果你需要寫作輔…

AutoGen深度解析:從核心架構到多智能體協作的完整指南

AutoGen是微軟推出的一個革命性多智能體(Multi-Agent)框架&#xff0c;它通過模塊化設計和靈活的對話機制&#xff0c;極大地簡化了基于大型語言模型(LLM)的智能體系統開發。本文將深入剖析AutoGen的兩個核心模塊——core基礎架構和agentchat多智能體對話系統&#xff0c;帶您全…

HTML的svg元素

<svg>元素 <svg>是一種用于描述二維矢量圖形的 XML 格式&#xff0c;可以直接嵌入 HTML 文檔中。 <svg>基本用法 <svg>的幾種基本用法,包括圓形&#xff0c;正方形&#xff0c;三角形&#xff0c;直線 &#xff0c;折線等 <body><svg widt…

Qt 子項目依賴管理:從原理到實踐的最佳分析:depends還是 CONFIG += ordered

1. 問題背景 在Qt項目開發中&#xff0c;當一個工程包含多個子項目&#xff08;如庫、插件、測試模塊&#xff09;時&#xff0c;如何正確管理它們的構建順序和依賴關系&#xff1f; 如&#xff1a; 在開發一個包含核心庫&#xff08;core&#xff09;、GUI模塊&#xff08;g…

業務冪等性技術架構體系-接口冪等

接口冪等 對于冪等的考慮&#xff0c;主要解決兩點前后端交互與服務間交互。這兩點有時都要考慮冪等性的實現。從前端的思路解決 的話&#xff0c;主要有三種&#xff1a;前端防重、PRG模式、Token機制。 前端防重 通過前端防重保證冪等是最簡單的實現方式&#xff0c;前端相關…

AI工具導航大全 | 2025精選版(持續更新)

&#x1f680; AI工具導航大全 | 2025精選版&#xff08;持續更新&#xff09; 更新日期&#xff1a;2025-04-11 | 適用場景&#xff1a;學術研究 | 辦公提效 | 創意設計 | 開發編程 數據來源&#xff1a;綜合高校實驗室、企業實踐及開發者社區推薦 &#x1f50d; 導航目錄 &…

驅動-內核空間和用戶空間數據交換

內核空間與用戶控件數據交換 前面了解的字符設備中對 file_operations 結構體的進行了填充&#xff0c; 該 結構體的每一個成員都對應著一個系統調用&#xff0c; 例如 read、 write 等&#xff0c; 在字符設備相關的文章中有實驗過對 調用函數進行了標志打印&#xff0c; 并沒…

5G_WiFi_CE_DFS

目錄 一、規范要求 1、法規目錄 2、定義 3、運行模式 4、主/從設備相關的運行行為及具體的動態頻率選擇&#xff08;DFS&#xff09;要求 5、產品角色確定測試項目 6、測試項目 測試項1&#xff1a;信道可用性檢查&#xff08;Channel Availability Check&#xff09; …

Devops之GitOps:什么是Gitops,以及它有什么優勢

GitOps 定義 GitOps 是一種基于版本控制系統&#xff08;如 Git&#xff09;的運維實踐&#xff0c;將 Git 作為基礎設施和應用程序的唯一事實來源。通過聲明式配置&#xff0c;系統自動同步 Git 倉庫中的期望狀態到實際運行環境&#xff0c;實現持續交付和自動化運維。其核心…

【藍橋杯】單片機設計與開發,第十二屆

/*頭文件聲明區*/ #include <STC15F2K60S2.H>//單片機寄存器頭文件 #include <init.h>//初始化底層驅動頭文件 #include <led.h>//led,蜂鳴器,繼電器底層驅動頭文件 #include <key.h>//按鍵底層驅動頭文件 #include <seg.h>//數碼管底層驅動頭…

Vue3連接MQTT作為客戶端

先下載依賴 npx --yes --registry https://registry.npmmirror.com npm install mqtt 在src的api創建 mes.js // 導入axios import axios from axios;// 定義一個變量,記錄公共的前綴, baseURL const baseURL http://localhost:8080; const instance axios.create({ base…

主服務器和子服務器之間通過NFS實現文件夾共享

背景&#xff1a; 子服務器想做一個備份服務器 但是之前有很多文件是上傳到本地的&#xff0c;于是服務要從本地讀取文件 但是在不在同一臺服務器中&#xff0c;讀取就會有問題&#xff0c;想 實現在兩者之間創建一個共享文件夾 一 NFS掛載步驟&#xff1a; 在主服務器&#…

LeetCode算法題(Go語言實現)_39

題目 給定一個二叉樹的根節點 root&#xff0c;想象自己站在它的右側&#xff0c;按照從頂部到底部的順序&#xff0c;返回從右側所能看到的節點值。 一、代碼實現 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func rightSideView(root *TreeNode) []int {i…

【AI提示詞】長期主義助手提供規劃支持

提示說明 長期主義是一種關注長期利益和持續學習的思維模式&#xff0c;幫助個人和組織在快速變化的環境中保持耐心和系統性思考。 提示詞 # Role: Long-termist Assistant## Profile - language: 中文 - description: 長期主義是一種關注長期利益和持續學習的思維模式&…

數組 array

1、數組定義 是一種用于存儲多個相同類型數據的存儲模型。 2、數組格式 &#xff08;1&#xff09;數據類型[ ] 變量名&#xff08;比較常見這種格式&#xff09; 例如&#xff1a; int [ ] arr0&#xff0c;定義了一個int類型的數組&#xff0c;數組名是arr0&#xff1b; &am…

基于JavaAPIforKml實現Kml 2.2版本的全量解析實踐-以兩步路網站為例

目錄 前言 一、關于兩步路網站 1、相關功能 2、數據結構介紹 二、JAK的集成與實現 1、JAK類圖簡介 2、解析最外層數據 3、解析擴展元數據和樣式 4、遞歸循環解析Feature 5、解析具體的數據 三、結論 前言 隨著地理信息技術的快速發展&#xff0c;地理空間數據的共享…

腦科學與人工智能的交叉:未來智能科技的前沿與機遇

引言 隨著科技的迅猛發展&#xff0c;腦科學與人工智能&#xff08;AI&#xff09;這兩個看似獨立的領域正在發生深刻的交匯。腦機接口、神經網絡模型、智能機器人等前沿技術&#xff0c;正帶來一場跨學科的革命。這種結合不僅推動了科技進步&#xff0c;也在醫療、教育、娛樂等…

3.1.3.2 Spring Boot使用Servlet組件

在Spring Boot應用中使用Servlet組件&#xff0c;可以通過注解和配置類兩種方式注冊Servlet。首先&#xff0c;通過WebServlet注解直接在Servlet類上定義URL模式&#xff0c;Spring Boot會自動注冊該Servlet。其次&#xff0c;通過創建配置類&#xff0c;使用ServletRegistrati…

《AI大模型應知應會100篇》第10篇:大模型的涌現能力:為什么規模如此重要

第10篇&#xff1a;大模型的涌現能力&#xff1a;為什么規模如此重要 摘要 在人工智能領域&#xff0c;“規模"始終是大模型發展的核心關鍵詞。隨著參數量從百萬級躍升至萬億級&#xff0c;大模型展現出令人驚嘆的"涌現能力”&#xff1a;這些能力在小模型中幾乎不可…

安寶特案例 | Fundació Puigvert 醫院應用AR技術開創尿石癥治療新紀元

案例介紹 在醫療科技不斷進步的今天&#xff0c;Fundaci Puigvert 醫院邁出了重要一步&#xff0c;成功應用AR技術進行了全球首例同時使用兩臺內窺鏡的ECIRS手術&#xff08;內鏡腎內聯合手術&#xff09;&#xff0c;由Esteban Emiliani M.D. PhD F.E.B.U 博士主刀。這標志著…