无重复字符的最长子串_滑动窗口
生活随笔
收集整理的這篇文章主要介紹了
无重复字符的最长子串_滑动窗口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路:
這道題主要用到思路是:滑動窗口。
其實就是一個隊列,比如例題中的 abcabcbb,進入這個隊列(窗口)為 abc 滿足題目要求,當再進入 a,隊列變成了 abca,這時候不滿足要求。所以,我們要移動這個隊列!
如何移動?
我們只要把隊列的左邊的元素移出就行了(不斷地縮小左邊窗口),直到窗口中不存在與要入隊的字符重復的字符為止。
一直維持這樣的隊列,找出隊列出現最長的長度時候,求出解!
時間復雜度:O(n)
// 滑動窗口 // 每一時刻,窗口都表示一個無重復字符的子串class Solution { public:int lengthOfLongestSubstring(string s) {if(s.size()==0) return 0;unordered_set<char> que;//無序且不允許重復的一種數據結構,無序set->哈希表,記錄窗口中已經出現的字符int res=0;//最長子串長度int left=0;//滑動窗口左下標,i相當于滑動窗口右下標for(int ii=0;ii<s.size();ii++){//不斷地縮小左邊窗口,直到窗口中不存在與下一個字符重復的字符為止。//為什么這樣?//你可能會有這樣的疑問:abc 再進來一個 b 或者c 怎莫辦?它會一直刪掉左邊的那個元素,直到刪掉了那個重復的b為止while(que.find(s[ii])!=que.end()){que.erase(s[left]);left++;}que.insert(s[ii]);//加入了新元素,相當于右邊窗口向右拉伸res=max(res,ii-left+1);//如果有前后兩個位置,計算個數用終止位置減去起始位置+1。}return res;} };總結
以上是生活随笔為你收集整理的无重复字符的最长子串_滑动窗口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输出序列和
- 下一篇: 最小覆盖子串_滑动窗口