日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode3:Longest Substring Without Repeating Characters

發(fā)布時間:2023/11/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode3:Longest Substring Without Repeating Characters 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原題鏈接:傳送門

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

題目大意:

給定一個字符串,找到?jīng)]有重復字符的最長子串,然后返回這個子串的長度。比如“abcabcbb”中沒有重復字符的最長子串是“abc”,返回3;“bbbbbbbb”中沒有重復字符的最長子串是“b”,返回1。

這個題目的解決思路主要有兩個,一個是哈希表,一個是雙游標遍歷。

由于要找沒有重復字符的子串,所以我們要記住當前子串中都出現(xiàn)了什么字符。這里用unordered_set來存儲出現(xiàn)的字符。下面是unordered_set的簡單介紹,以后再詳細了解下。

unordered表示它是無序的,也就是說,容器中的元素沒有特別的次序關系,set說明這是一個set容器,也就是說元素的值可以標示對應的元素。然后我們需要兩個游標來對字符串進行遍歷,一個begin一個end,end游標主動向前移動,每移動一步,就在哈希表中檢查end游標對應的字符是否存在,如果不存在,說明當前begin到end之間的子串滿足沒有重復字符的要求,end可以繼續(xù)移動;如果end對應的字符在哈希表中已經(jīng)存在,說明在begin到end之間有一個字符和end對應的字符相同,接下來就需要找到這個字符,由于這個字符在end的左面,這時需要用begin游標來找到這個字符。

begin游標的任務是找到begin到end這一子串中和end對應的字符相等的字符,需要begin逐一檢查,如果相同說明找到,可以退出循環(huán);如果不同,說明begin到end之間的子串還不符合條件,因此可以將begin對應的字符從哈希表中刪除。

在遍歷的過程中,依次更新最大長度,直到遍歷完,就可以得到結(jié)果。對應的代碼如下:

class Solution { public:int lengthOfLongestSubstring(string s) {int n=s.size();if(n==0)return 0;//哈希表,用來存儲當前子串中已經(jīng)出現(xiàn)的字符unordered_set<char> is_shown;int begin=0;//左游標int end=0;//右游標int ret=0;//返回結(jié)果//對整個字符串進行遍歷while(end<n){unordered_set<char>::iterator it;//查找end對應的字符是否出現(xiàn)過it=is_shown.find(s[end]);//出現(xiàn)過if(it!=is_shown.end()){//更新ret的值if(ret<end-begin)ret=end-begin;//end對應的字符在當前子串中出現(xiàn)過,說明在begin到end之間有一個和s[end]相同,找到它while(s[begin]!=s[end]){//不同的時候,需要把begin對應的字符從哈希表中刪除,因為它已經(jīng)不再當前子串中了is_shown.erase(s[begin]);begin++;}//循環(huán)結(jié)束,此時s[begin]和s[end]相同,向右移一位begin++;}//沒出現(xiàn)過,說明當前子串仍然滿足條件,并將s[end]添加到哈希表中else{is_shown.insert(s[end]);}//end右移end++;}//更新retret=max(ret,end-begin);return ret;} };

總結(jié)

以上是生活随笔為你收集整理的LeetCode3:Longest Substring Without Repeating Characters的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。