[LeetCode] 3. Longest Substring Without Repeating Characters 題解

問題描述

輸入一個字符串,找到其中最長的不重復子串

例1:

輸入:"abcabcbb"
輸出:3
解釋:最長非重復子串為"abc"
復制代碼

例2:

輸入:"bbbbb"
輸出:1
解釋:最長非重復子串為"b"
復制代碼

例3:

輸入:"pwwkew"
輸出:3
解釋:最長非重復子串為"wke"
復制代碼

問題難度

Medium

解題思路

本題采用「滑動窗口法」可以達到較理想的時間復雜度 O(n),滑動窗口指的是當前非重復子串所在的窗口,此滑動窗口有兩種操作方法

  1. 檢查下一個字符是否會重復,如未重復,則將窗口向右擴大
  2. 發現重復字符,則將窗口右邊界保持不變,左邊界右移,以此縮小窗口

上面的操作比較容易理解,唯一需要注意的是第 2 點中,當發現重復字符時,窗口左邊界向右移動幾個單位,我們可以看一個示意圖:

+---------+ 
| a b c d | e d x y z 
+---------++-----------+ 
| a b c d e | d x y z // 未發現重復,向右擴大窗口
+-----------++-----+ 
a b c d | e d | x y z // 發現重復,縮小窗口+-----+
復制代碼

假設輸入字符串為 "abcdedxyz",一直到我們遍歷到字符 e 時,均未發現重復的字符串,至此對窗口進行的操作都是向右擴大,當檢查到下一個字符 d 時,由于前面字符串中已經出現過該字符,所以窗口左邊界需要進行右移,移動的位置、即新子串窗口的起始點,正好是兩個重復字符中、第一個重復字符的右邊,如圖所示為字符 e 所在的位置。

至此,我們可以開始寫程序了:

def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""maxlen = 0current_substring = [None]*128current_substring_len = 0begin_index = 0for i in s:stoi = ord(i)if current_substring[stoi] is None or current_substring[stoi] < begin_index:current_substring[stoi] = begin_index + current_substring_lencurrent_substring_len += 1else:if maxlen < current_substring_len:maxlen = current_substring_len sub_len = current_substring[stoi] - begin_index + 1begin_index = current_substring[stoi] + 1current_substring_len -= sub_lencurrent_substring[stoi] = current_substring_len + begin_indexcurrent_substring_len += 1if maxlen < current_substring_len:maxlen = current_substring_lenreturn maxlen
復制代碼

以上代碼中,current_substring 是一個緩沖區,用來存放當前子字符串,緩沖區聲明為 128 個是為了讓數組的下標空間能容納 128 個 ASCII 字符,即這里用數組的下標來表示字符,這樣做的好處是可以很快的知道某個字符是否出現重復,數組的內容我們填的是該字符對應的下標,例如字符串 "abcde" 填到 current_substring 中為:

            index:   0..97  98  99  100 101 ..+---+---+---+---+---+---+---+
current_substring: |...| 0 | 1 | 2 | 3 | 4 |...|+---+---+---+---+---+---+---+
復制代碼

我們用變量 begin_index 來記錄當前窗口在字符串中的起始位置,而 current_substring_len 用來記錄當前窗口的長度。for 循環是對字符串的遍歷。

首先將字符轉化為其對應的整數 stoi,檢查 stoi 中的內容是否為空,或其存儲的位置是否在窗口的左邊,如是則表示該字符在 begin_index 之后未出現過,非重復子串可以繼續累加。

否則表示出現重復,出現重復時,需要將窗口的左邊界右移,或者說對新的滑動窗口進行初始化,實際上只需更新 begin_indexcurrent_substring_len 兩個值。

最后,我們需要在每一次窗口改變時,或在結束遍歷時,判斷當前子字符串的長度是否是最長的,并將最長串存儲在 maxlen 中,作為結果返回。

原題鏈接

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

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

相關文章

WPF中MVVM模式的 Event 處理

WPF的有些UI元素有Command屬性可以直接實現綁定&#xff0c;如Button 但是很多Event的觸發如何綁定到ViewModel中的Command呢&#xff1f; 答案就是使用EventTrigger可以實現。 繼續上一篇對Slider的研究&#xff0c;在View中修改Interaction. <i:Interaction.Triggers>&…

Eclipse 插件開發 向導

閱讀目錄 最近由于特殊需要&#xff0c;開始學習插件開發。   下面就直接弄一個簡單的插件吧!   1 新建一個插件工程   2 創建自己的插件名字&#xff0c;這個名字最好特殊一點&#xff0c;一遍融合到eclipse的時候&#xff0c;不會發生沖突。   3 下一步&#xff0c;進…

線性回歸 假設_線性回歸的假設

線性回歸 假設Linear Regression is the bicycle of regression models. It’s simple yet incredibly useful. It can be used in a variety of domains. It has a nice closed formed solution, which makes model training a super-fast non-iterative process.線性回歸是回…

ES6模塊與commonJS模塊的差異

參考&#xff1a; 前端模塊化 ES6 在語言標準的層面上&#xff0c;實現了模塊功能&#xff0c;而且實現得相當簡單&#xff0c;旨在成為瀏覽器和服務器通用的模塊解決方案。 其模塊功能主要由兩個命令構成&#xff1a;export和import。export命令用于規定模塊的對外接口&#x…

solo

solo - 必應詞典 美[so?lo?]英[s??l??]n.【樂】獨奏(曲)&#xff1b;獨唱(曲)&#xff1b;單人舞&#xff1b;單獨表演adj.獨唱[奏]的&#xff1b;單獨的&#xff1b;單人的v.獨奏&#xff1b;放單飛adv.獨網絡梭羅&#xff1b;獨奏曲&#xff1b;索羅變形復數&#xff1…

Eclipse 簡介和插件開發天氣預報

Eclipse 簡介和插件開發 Eclipse 是一個很讓人著迷的開發環境&#xff0c;它提供的核心框架和可擴展的插件機制給廣大的程序員提供了無限的想象和創造空間。目前網上流傳相當豐富且全面的開發工具方面的插件&#xff0c;但是 Eclipse 已經超越了開發環境的概念&#xff0c;可以…

趣味數據故事_壞數據的好故事

趣味數據故事Meet Julia. She’s a data engineer. Julia is responsible for ensuring that your data warehouses and lakes don’t turn into data swamps, and that, generally speaking, your data pipelines are in good working order.中號 EETJulia。 她是一名數據工程…

Linux 4.1內核熱補丁成功實踐

最開始公司運維同學反饋&#xff0c;個別宿主機上存在進程CPU峰值使用率異常的現象。而數萬臺機器中只出現了幾例&#xff0c;也就是說萬分之幾的概率。監控產生的些小誤差&#xff0c;不會造成宕機等嚴重后果&#xff0c;很容易就此被忽略了。但我們考慮到這個異常轉瞬即逝、并…

python分句_Python循環中的分句,繼續和其他子句

python分句Python中的循環 (Loops in Python) for loop for循環 while loop while循環 Let’s learn how to use control statements like break, continue, and else clauses in the for loop and the while loop.讓我們學習如何在for循環和while循環中使用諸如break &#xf…

eclipse plugin 菜單

簡介&#xff1a; 菜單是各種軟件及開發平臺會提供的必備功能&#xff0c;Eclipse 也不例外&#xff0c;提供了豐富的菜單&#xff0c;包括主菜單&#xff08;Main Menu&#xff09;&#xff0c;視圖 / 編輯器菜單&#xff08;ViewPart/Editor Menu&#xff09;和上下文菜單&am…

[翻譯 EF Core in Action 2.0] 查詢數據庫

Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的關于Entityframework Core 書籍。原版地址. 是除了官方文檔外另一個學習EF Core的不錯途徑, 書中由淺入深的講解的EF Core的相關知識。因為沒有中文版,所以本人對其進行翻譯。 預計每兩天…

hdu5692 Snacks dfs序+線段樹

題目傳送門 題目大意&#xff1a;給出一顆樹&#xff0c;根節點是0&#xff0c;有兩種操作&#xff0c;一是修改某個節點的value&#xff0c;二是查詢&#xff0c;從根節點出發&#xff0c;經過 x 節點的路徑的最大值。 思路&#xff1a;用樹狀數組寫發現還是有些麻煩&#xff…

python數據建模數據集_Python中的數據集

python數據建模數據集There are useful Python packages that allow loading publicly available datasets with just a few lines of code. In this post, we will look at 5 packages that give instant access to a range of datasets. For each package, we will look at h…

打開editor的接口討論

【打開editor的接口討論】 先來看一下workbench吧&#xff0c;workbench從靜態劃分應該大致如下&#xff1a; 從結構圖我們大致就可以猜測出來&#xff0c;workbench page作為一個IWorkbenchPart&#xff08;無論是eidtor part還是view part&#…

【三角函數】已知直角三角形的斜邊長度和一個銳角角度,求另外兩條直角邊的長度...

如圖,已知直角三角形ABC中,∠C90, ∠Aa ,ABc ,求直角邊AC、BC的長度. ∵ ∠C90,∠Aa ,ABc ,Cos∠AAC/AB ,Sin∠ABC/AB ,∴ ACAB*Cos∠Ac*Cosa ,BCAB*Sin∠Ac*Sina . 復制代碼

網絡攻防技術實驗五

2018-10-23 實驗五 學 號201521450005 中國人民公安大學 Chinese people’ public security university 網絡對抗技術 實驗報告 實驗五 綜合滲透 學生姓名 陳軍 年級 2015 區隊 五 指導教師 高見 信息技術與網絡安全學院 2018年10月23日 實驗任務總綱 2018—2019 …

usgs地震記錄如何下載_用大葉草繪制USGS地震數據

usgs地震記錄如何下載One of the many services provided by the US Geological Survey (USGS) is the monitoring and tracking of seismological events worldwide. I recently stumbled upon their earthquake datasets provided at the website below.美國地質調查局(USGS)…

Springboot 項目中 xml文件讀取yml 配置文件

2019獨角獸企業重金招聘Python工程師標準>>> 在xml文件中讀取yml文件即可&#xff0c;代碼如下&#xff1a; 現在spring-boot提倡零配置&#xff0c;但是的如果要集成老的spring的項目&#xff0c;涉及到的bean的配置。 <bean id"yamlProperties" clas…

eclipse 插件打包發布

如果想把調試好的插件打包發布&#xff0c;并且在ECLIPSE中可以使用. 1.File-->Export 2.選擇 PLug-in Development下 的 Deployable plug-ins and fragments 3.進入 Deployable plug-ins and fragments 頁面 4.把底下的 Destubatuib 的選項中選擇 Archive file 在這里添入要…

無法獲取 vmci 驅動程序版本: 句柄無效

https://jingyan.baidu.com/article/a3a3f811ea5d2a8da2eb8aa1.html 將 vmci0.present "TURE" 改為 “FALSE”; 轉載于:https://www.cnblogs.com/limanjihe/p/9868462.html