無重復字符的最長子串(LeetCode 3)

文章目錄

  • 1.問題描述
  • 2.難度等級
  • 3.熱門指數
  • 4.解題思路
    • 方法一:暴力法
    • 方法二:滑動窗口
  • 參考文獻

1.問題描述

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

s 由英文字母、數字、符號和空格組成。

示例 1:

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

示例 2:

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

示例 3:

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

2.難度等級

Medium。

3.熱門指數

★★★★★

出題公司:阿里、騰訊、字節。

4.解題思路

方法一:暴力法

我們可以遍歷字符串的所有字符,計算每個字符為起點的不含有重復字符的字串長度,記錄到全局變量。

以示例 1 中的字符串 “abcabcbb” 為例,演示暴力法的求解過程。

以 (a)bcabcbb 開始的最長字符串為 (abc)abcbb
以 a(b)cabcbb 開始的最長字符串為 a(bca)bcbb
以 ab(c)abcbb 開始的最長字符串為 ab(cab)cbb
以 abc(a)bcbb 開始的最長字符串為 abc(abc)bb
以 abca(b)cbb 開始的最長字符串為 abca(bc)bb
以 abcab(c)bb 開始的最長字符串為 abcab(cb)b
以 abcabc(b)b 開始的最長字符串為 abcabc(b)b
以 abcabcb(b) 開始的最長字符串為 abcabcb(b)所以最長子串長度為 3。

如何判斷重復字符?

常用的數據結構為哈希集合(即 C++ 中的 std::unordered_set,Java 中的 HashSet,Python 中的 set, JavaScript 中的 Set 和 Golang 中的 map 等)。

時間復雜度: O ( n 2 ) O(n^2) O(n2),n 為字符串長度。

空間復雜度: 最好為 O(1),最壞為 O(n)。

方法二:滑動窗口

暴力法的求解過程,實際上存在不必要的檢查。

以示例 1 中的字符串 “abcabcbb” 為例,演示暴力法的求解過程可優化的地方。

以 (a)bcabcbb 開始的最長字符串為 (abc)abcbb
以 a(b)cabcbb 開始的最長字符串為 a(bca)bcbb
以 ab(c)abcbb 開始的最長字符串為 ab(cab)cbb
以 abc(a)bcbb 開始的最長字符串為 abc(abc)bb下面這一步是沒有必要的,因為以 b 開始的不重復子串 bc 在上一個不重復子串內,長度肯定小于上一個不重復子串。
以 abca(b)cbb 開始的最長字符串為 abca(bc)bb以 abcab(c)bb 開始的最長字符串為 abcab(cb)b同理,下面這一步也是沒有必要的。
以 abcabc(b)b 開始的最長字符串為 abcabc(b)b以 abcabcb(b) 開始的最長字符串為 abcabcb(b)

在獲取一個子串時,如果遇到了重復字符,那么獲取下一個無重復字符的子串時,應該從重復字符的下一個字符開始。

將無重復字符的子串想象成一個滑動窗口,整個求解過程是移動滑動窗口的過程。

如何移動滑動窗口?

當出現重復字符時,我們只要把窗口內重復字符及其左邊的元素移出就行了。

一直維持這樣的窗口,直至窗口滑動到最后一個字符。記錄最長的窗口長度,求出解!

時間復雜度: O(n),n 為字符串長度。

空間復雜度: 最好為 O(1),最壞為 O(n)。

下面以 Golang 為例,給出實現。

func lengthOfLongestSubstring(s string) int {var longest intm := make(map[rune]bool)var left intfor _, c := range s {for m[c] {delete(m, rune(s[left]))left++}m[c] = trueif len(m) > longest {longest = len(m)}}return longest
}

參考文獻

3. 無重復字符的最長子串

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

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

相關文章

基于Java商品銷售管理系統

基于Java商品銷售管理系統 功能需求 1、商品管理:系統需要提供商品信息的管理功能,包括商品的錄入、編輯、查詢和刪除。每個商品應包含基本信息如名稱、編碼、類別、價格、庫存量等。 2、客戶管理:系統需要能夠記錄客戶的基本信息&#xf…

算法:常見的哈希表算法

文章目錄 兩數之和判斷是否互為字符重排存在重復元素存在重復元素字母異位詞分組 本文總結的是關于哈希表常見的算法 哈希表其實就是一個存儲數據的容器,所以其實它本身的算法難度并不高,只是利用哈希表可以對于一些場景進行優化 兩數之和 class Solut…

Michael.W基于Foundry精讀Openzeppelin第41期——ERC20Capped.sol

Michael.W基于Foundry精讀Openzeppelin第41期——ERC20Capped.sol 0. 版本0.1 ERC20Capped.sol 1. 目標合約2. 代碼精讀2.1 constructor() && cap()2.2 _mint(address account, uint256 amount) 0. 版本 [openzeppelin]:v4.8.3,[forge-std]&…

AI智能降重軟件大全,免費最新AI智能降重軟件

在當今信息爆炸的時代,內容創作者們面臨著巨大的寫作壓力,如何在保持高質量的前提下提高效率成為擺在許多人面前的難題。AI智能降重軟件因其獨特的算法和功能逐漸成為提升文案質量的得力助手。本文將專心分享一些優秀的AI智能降重軟件。 147SEO改寫軟件 …

云貝教育 |【技術文章】PostgreSQL中誤刪除數據怎么辦(一)

原文鏈接:【PostgreSQL】PostgreSQL中誤刪除數據怎么辦(一) - 課程體系 - 云貝教育 (yunbee.net) 在我們學習完PG的MVCC機制之后,對于DML操作,被操作的行其實并未被刪除,只能手工vacuum或自動vacuum觸發才會…

【分享】我想上手機器學習

目錄 前言 一、理解機器學習 1.1 機器學習的目的 1.2 機器學習的模型 1.3 機器學習的數據 二、學習機器學習要學什么 2.1 學習機器學習的核心內容 2.2 怎么選擇模型 2.3 怎么獲取訓練數據 2.4 怎么訓練模型 三、機器學習的門檻 3.1 機器學習的第一道門檻 3.2 機器…

最新版IDEA專業版大學生申請免費許可證教學(無需學校教育郵箱+官方途徑+非破解手段)

文章目錄 前言1. 申請學籍在線驗證報告2. 進入IDEA官網進行認證3. 申請 JB (IDEA) 賬號4. 打開 IDEA 專業版總結 前言 當你進入本篇文章時, 你應該是已經遇到了 IDEA 社區版無法解決的問題, 或是想進一步體驗 IDEA 專業版的強大. 本文是一篇學生申請IDEA免費許可證的教學, 在學…

unity 2d 入門 飛翔小鳥 小鳥碰撞 及死亡(九)

1、給地面,柱體這種添加2d盒裝碰撞器,小鳥移動碰到就不會動了 2、修改小鳥的腳本(腳本命名不規范,不要在意) using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : Mo…

kafka高吞吐、低延時、高性能的實現原理

作者:源碼時代-Raymon老師 Kafka的高吞吐、低延時、高性能的實現原理 Kafka是大數據領域無處不在的消息中間件,目前廣泛使用在企業內部的實時數據管道,并幫助企業構建自己的流計算應用程序。Kafka雖然是基于磁盤做的數據存儲,但…

可信固件-M (TF-M)

概述: 參考: Trusted Firmware-M Documentation — Trusted Firmware-M v2.0.0 documentation 開源代碼托管: trusted-firmware-m.git - Trusted Firmware for M profile Arm CPUs STM32 U5支持TF-M : STM32U5 — Trusted Firmware-M v2.0.0 document…

Meta Platforms推出Imagine:基于Emu的免費AI文本到圖像生成器服務

Meta Platform是Facebook、Instagram 和 WhatsApp 的母公司,也是領先的開源AI人工智能大語言模型 Llama 2的創建者。Meta Platforms 推出了一個名為 Imagine 的獨立文本到圖像 AI 生成器服務。Imagine 是基于 Meta 自己的 AI 模型 Emu 構建的,Emu 是在11…

循環結構中 break、continue、return 和exit() 的區別

循環結構中 break、continue、return 和exit() 的區別 文章目錄 循環結構中 break、continue、return 和exit() 的區別一、break語句二、continue語句三、return 語句四、exit() 函數 說明:本文內容參考牟海軍 著《C語言進階: 重點、難點與疑點解析》&a…

HTML程序大全(1):簡易計算器

HTML代碼&#xff0c;主要創建了幾個按鈕。 <div class"container"><div class"output" id"output">0</div><button class"button" onclick"clearOutput()" id"clear">C</button>…

C#調用win10系統自帶軟鍵盤的方法

上次做了個筆記是關于調用windows系統自帶的觸摸鍵盤的方法&#xff1a;C#調用Windows系統自帶觸摸鍵盤的方法_c# 虛擬鍵盤-CSDN博客 除了調用觸摸鍵盤&#xff0c;我們也可以通過調用win10的自帶軟鍵盤作為輸入途徑。 方法很簡單。 1、添加using System.Diagnostics引用。 …

選自《洛谷深入淺出進階篇》——歐拉函數+歐拉定理+擴展歐拉定理

歐拉函數&#xff1a; 歐拉函數定義&#xff1a; 1~n中與n互質的數的個數。 比如 歐拉函數是積性函數&#xff1a;&#xff08;也就是&#xff09;當 n與m互質的時候&#xff1a; 由算術基本定理&#xff0c;我們可以設n&#xff0c;那么我們只要計算出的取值就能求出的取…

5組10個共50個音頻可視化效果PR音樂視頻制作模板

我們常常看到的圖形跟著音樂跳動&#xff0c;非常有節奏感&#xff0c;那這個是怎么做到的呢&#xff1f;5組10個共50個音頻可視化效果PR音樂視頻制作模板滿足你的制作需求。 PR音樂模板|10個音頻可視化視頻制作模板05 https://prmuban.com/36704.html 10個音頻可視化視頻制作…

linux下查看文件當下的所有文件的大小和查找大文件

要查詢一個文件夾下面所有文件的總大小&#xff0c;您可以使用 du 命令配合一些參數。如果您只關心總大小&#xff0c;而不是各個子文件夾或文件的大小&#xff0c;可以使用以下命令&#xff1a; du -sh /path/to/your/directory在這個命令中&#xff1a; du 是磁盤使用情況的…

設計師福利!免費實用的7款Figma插件,讓你的工作事半功倍!

如今&#xff0c;Figma已經成為主流的原型和數字設計軟件之一&#xff0c;許多UI設計師和設計團隊開始選擇使用Figma。隨著Figma的快速更新和迭代&#xff0c;Figma插件庫變得越來越豐富。如果使用得當&#xff0c;將有助于提高您的設計效率。本文將介紹7個工作中非常實用的Fig…

echarts詞云圖echarts-wordcloud使用方法

1、echarts5.0以下的版本使用 echarts-wordcloud 1.0 的詞云 1. 安裝 wordCloud 1.0 依賴包npm install echarts-wordcloud12. man.js 注入import echarts-wordcloud 2、echarts5.0及以上的下載 echarts-wordcloud 2.0 版本 注意&#xff1a;npm install echarts-wordcloud …

微軟發布Orca2,“調教式”教會小規模大語言模型如何推理!

我們都知道在大多數情況下&#xff0c;語言模型的體量和其推理能力之間存在著正相關的關系&#xff1a;模型越大&#xff0c;其處理復雜任務的能力往往越強。 然而&#xff0c;這并不意味著小型模型就永遠無法展現出色的推理性能。最近&#xff0c;奶茶發現了微軟的Orca2公開了…