算法題打卡力扣第3題:無重復字符的最長子串(mid)

文章目錄

    • 題目描述
    • 解法一:暴力解
    • 解法二:滑動窗口

題目描述

在這里插入圖片描述

解法一:暴力解

遍歷每一個可能的子串,然后逐一判斷每個子串中是否有重復字符。

具體步驟:

  • 使用兩層嵌套循環來生成所有子串的起止位置:
    外層循環 i 從 0 到 n-1 (起始位置)。
    內層循環 j 從 i 到 n-1 (結束位置)。
  • 對于每一個子串 s.substring(i, j+1),我們再設計一個輔助函數 hasDuplicate(substring) 來檢查這個子串中是否存在重復字符。
  • 檢查 hasDuplicate 通常需要使用一個哈希集合 (Set):遍歷子串的每個字符,嘗試加入 Set。如果某個字符加入失敗(因為 Set 中已存在),則說明有重復。
  • 如果沒有重復,我們就用 j - i + 1 來更新記錄的最大長度 max_len。

實現代碼

#include <unordered_set> // 用于哈希集合
#include <algorithm>     // 用于 std::max
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.length();int max_len = 0;for(int i=0;i<n;++i){for(int j=i;j<n;++j){std::string substring = s.substr(i,j-i+1);if(!hasDuplicate(substring)){max_len = std::max(max_len,(int)substring.length());}}}return max_len;}bool hasDuplicate(const std::string&s){std::unordered_set<char> seen_characters;for(char c : s){if(!seen_characters.insert(c).second){return true;}}return false;}
};

執行結果
超出時間范圍了
在這里插入圖片描述

復雜度分析
時間:O(n^3)
空間:O(n)

解法二:滑動窗口

我們維護一個窗口 [start, end],它始終代表一個不包含重復字符的子串。我們不斷嘗試擴大這個窗口的右邊界end。如果在這個過程中,新加入的字符導致了窗口內出現重復,我們就需要收縮窗口的左邊界 start,直到窗口內不再有重復字符為止。

如何快速判斷字符是否重復以及其位置?
我們需要一個數據結構來高效地完成兩件事:
判斷一個字符是否已經在當前窗口中。
如果存在,找出它上次出現的位置。
哈希映射 (Map) 或數組是完美的選擇。
哈希映射 Map<Character, Integer>:鍵 (Key) 存儲字符,值 (Value) 存儲該字符的最新索引。
數組 int[128]:如果字符集是 ASCII,我們可以用一個大小為 128 的數組來模擬哈希映射,數組的索引是字符的 ASCII 碼,值是該字符的最新索引。這比哈希映射更快。

具體步驟 (以哈希映射為例):
初始化兩個指針:start = 0 (窗口左邊界),end = 0 (窗口右邊界)。
初始化 max_len = 0 (記錄最大長度)。
初始化一個哈希映射 map,用于存儲窗口內字符及其最新索引。
使用 end 指針作為主循環,從 0 遍歷到 n-1:
a. 獲取當前右邊界的字符 char_end = s[end]。
b. 檢查 char_end 是否導致重復:
i. 在 map 中查找 char_end。
ii. 如果 char_end 已經在 map 中存在,并且它上次出現的位置 map.get(char_end) 在當前窗口內(即 map.get(char_end) >= start),這說明我們遇到了一個重復字符。
iii. 為了消除這個重復,我們需要將窗口的左邊界 start 跳躍到重復字符的下一個位置。即 start = map.get(char_end) + 1。
c. 更新 map:無論是否重復,我們都需要更新 char_end 在 map 中的位置為當前的 end 索引。map.put(char_end, end)。
d. 更新 max_len:在每一步之后,當前有效的無重復子串的長度就是 end - start + 1。我們用它來更新 max_len。 max_len = max(max_len, end - start + 1)。
e. end 指針自增,考察下一個字符。
循環結束后,max_len 就是最終答案。
實現代碼


class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.length();if(n==0){return 0;}std::unordered_map<char,int> char_map;int max_len = 0;int start = 0;for(int end = 0;end<n;++end){char current_char = s[end];if(char_map.count(current_char)&&char_map[current_char] >= start){start = char_map[current_char] + 1;}char_map[current_char] = end;max_len = std::max(max_len,end-start+1);}return max_len;}};

執行結果
在這里插入圖片描述

復雜度分析
時間:O
空間:O

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

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

相關文章

HTML5 簡介和基礎骨架

一、HTML5 簡介HTML5 是 HTML&#xff08;超文本標記語言&#xff09;的第五個主要版本&#xff0c;于 2014 年 10 月由 W3C&#xff08;萬維網聯盟&#xff09;正式發布。它不僅是對 HTML4.01 和 XHTML 的升級&#xff0c;更是一套完整的 Web 技術標準&#xff0c;包含了新的標…

.NET技術深度解析:現代企業級開發指南

每日激勵&#xff1a; “不要一直責怪過去的自己&#xff0c;他曾經站在霧里也很迷茫” &#x1f31f; Hello&#xff0c;我是蔣星熠Jaxonic&#xff01; &#x1f308; 在浩瀚無垠的技術宇宙中&#xff0c;我是一名執著的星際旅人&#xff0c;用代碼繪制探索的軌跡。 &#x1…

蘋果手機文本轉音頻,自行制作背誦素材

當你在學習一段專業內容或者背誦重要知識點時&#xff0c;是不是有時會覺得眼睛看久了疲憊&#xff0c;而且記憶效果也不太理想呢&#xff1f;利用手頭的蘋果手機或iPad&#xff0c;你可以輕松將文本內容生成音頻文件&#xff0c;然后隨時隨地反復聽&#xff0c;這對于備考人士…

電子電子技術知識------MOSFET管

電子電子技術知識------MOSFET管前言一、結構與符號二、工作原理1.小功率MOSFET&#xff08;橫向導電&#xff09;2.電力MOS管三、基本特性總結前言 MOSFET是電力場效應晶體管的英文簡寫&#xff0c;又稱功率mos管&#xff0c;mos管 一、結構與符號 二、工作原理 1.小功率M…

仿真波導中超短脈沖傳輸中的各種非線性效應所產生的超連續譜

在波導中&#xff0c;超短脈沖傳輸時會受到各種非線性效應的影響&#xff0c;從而產生超連續譜。這些非線性效應包括自相位調制&#xff08;SPM&#xff09;、交叉相位調制&#xff08;XPM&#xff09;、四波混頻&#xff08;FWM&#xff09;等。基于MATLAB的仿真程序&#xff…

docker-compose的使用

目錄 1-查看容器 2-查看docker鏡像 3-運行兩個容器 4-進入idea 編寫docker-compose文件中的內容 5-編寫配置文件 6-運行 7-docker-compose中的一些命令 啟動服務 關閉服務 查看正在運行的容器 查看日志 重構新的服務 指令docker-compose 文件名 停止已運行的服務 啟動 重啟 1-查…

搭建分布式Hadoop集群[2025] 實戰筆記

文章目錄 一、實戰目標 二、集群規劃 1. 集群拓撲結構 2. 角色分配 說明: 三、環境準備 1. 修改 SSH 端口(安全加固) 操作步驟(所有節點執行): 2. FinalShell 連接配置 3. 防火墻配置 啟動并配置 firewalld: 關閉并禁用防火墻(生產環境建議精細配置,測試環境可關閉):…

【自記錄】Ubuntu20.04下Python自編譯

因為需要新的Python版本&#xff0c;但是我們不希望修改系統原生的Python版本避免某些系統應用無法啟動&#xff0c;因此自建一個干凈的路徑引入Python。 1.編譯 以下在aarch64下測試&#xff0c;x64下可能有差異 必須把相關的devel包安裝完畢&#xff0c;否則python可能缺功能…

Linux - 進程切換

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄進…

機器算法(五)模型選擇與調優

一 交叉驗證1 保留交叉驗證HoldOutholdOut Cross-validation(Train-Test Split)在這種交叉驗證技術中&#xff0c;整個技術集被隨機劃分為訓練集和驗證集。根據經驗法則&#xff0c;整個數據集的近70%被用作訓練集&#xff0c;其余30%被用作驗證集&#xff0c;也就是最常使用的…

Ubuntu 服務器實戰:Docker 部署 Nextcloud+ZeroTier,打造可遠程訪問的個人云

本次部署基于 Ubuntu 系統&#xff08;桌面版 / Server 版通用&#xff0c;核心操作一致&#xff09;&#xff0c;硬件配置參考如下&#xff0c;低配置主機可順暢運行&#xff1a; ubuntu服務器配置如下 硬件類型具體型號/參數CPUIntel Core i3-6100T內存條8GB&#xff08;DD…

移動硬盤刪除東西后,沒有釋放空間

請按照以下步驟&#xff0c;從最簡單、最常見的原因開始排查和解決&#xff1a;主要原因和解決方案1. 檢查操作系統回收站 (最常見原因&#xff01;)這是最容易被忽略的一點。當您直接在外接移動硬盤上刪除文件時&#xff0c;文件并不會直接消失&#xff0c;而是被移到了該移動…

spring boot驢友結伴游網站的設計與實現(代碼+數據庫+LW)

摘要 本文介紹了基于Spring Boot框架開發的驢友結伴游網站的設計與實現。該網站旨在為旅行愛好者提供一個便捷的平臺&#xff0c;使他們能夠輕松地尋找伙伴、預定酒店、參與活動以及分享旅行經歷。系統主要分為兩大模塊&#xff1a;用戶模塊和管理員模塊。用戶可以通過注冊賬號…

人機之間的強交互與弱交互

人機交互不是簡單的人機&#xff0c;其本質是人機環境系統的交互。在這個系統中&#xff0c;人和機器不是孤立的存在&#xff0c;而是在特定環境下相互影響、相互作用的一部分。人機之間的強交互與弱交互可以從以下幾個方面來理解&#xff1a;1、人機強交互通常是指人與機器之間…

OpenCV 基礎知識總結

學習網站 https://zhuanlan.zhihu.com/p/483604320 命名空間 using namespace cv; Mat 作用 創建圖像&#xff08;矩陣&#xff09; 格式 Mat image; //創建一個空圖像image&#xff0c;大小為0 Mat image(100,100,CV_8U); //指定矩陣大小&#xff08;矩陣行數/列數&#xff09…

C#基礎(⑦user32.dll)

我們來詳細學習如何使用 user32.dll&#xff0c;它是 Windows 系統中負責用戶界面交互的核心 DLL&#xff0c;包含窗口管理、消息處理、鍵盤鼠標輸入等功能。下面從基礎到進階&#xff0c;一步一步教你調用其中的常用函數。在 C# 中調用 user32.dll 需要使用 DllImport 特性&am…

Markdown格式.md文件的編輯預覽使用

推薦工具Visual Studio Code (VS Code) - 強烈推薦特點&#xff1a;微軟出品&#xff0c;免費、開源、跨平臺&#xff08;Windows, macOS, Linux&#xff09;。擁有海量插件市場。編輯體驗&#xff1a;安裝 Markdown All in One 等插件后&#xff0c;可以獲得語法高亮、實時預覽…

TypeScript:unknown 類型

作為前端開發工程師&#xff0c;在 TypeScript 中使用 unknown 類型是提升類型安全的關鍵實踐。下面我會結合實際開發場景詳細講解其特性和價值。unknown 核心特性1.類型安全的頂級類型與 any 類似&#xff0c;可接受任何類型的賦值&#xff1a;let userInput: unknown; userIn…

2025 批量下載hasmart所有知乎回答,文章和想法,導出txt,html和pdf

之前分享過文章2025 一鍵批量下載備份知乎回答/文章/想法/專欄/視頻/收藏夾&#xff0c;導出txt&#xff0c;html和 pdf &#xff0c;今天繼續下載hasmart這個號的所有知乎回答 下載的知乎回答目錄&#xff0c;包含發布時間和標題&#xff0c;點擊可跳轉對應回答。 2019年發布…

mapbox高階,結合threejs(threebox)添加管道,實現管道流動效果

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言 1.1 ??mapboxgl.Map 地圖對象 1.2 ??mapboxgl.Map style屬性 1.3 ??threebox add加載網格對象 二、??…