【LeetCode】無重複字符的最長子串【滑動窗口法】

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

示例 1:數據結構

輸入: "abcabcbb"
輸出: 3
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。
ui

示例 2:spa

輸入: "bbbbb"
輸出: 1
解釋: 由於無重複字符的最長子串是 "b",因此其長度爲 1。
code

示例 3:blog

輸入: "pwwkew"
輸出: 3
解釋: 由於無重複字符的最長子串是 "wke",因此其長度爲 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
索引

來源:力扣(LeetCode)
連接:
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters圖片

分析:leetcode

這三種方法都是屬於廣義上的滑動窗口法,只是採用的數據結構以及一些操做有所不一樣字符串

方法一:採用set判斷子串中是否存在該字符

暴力的複雜度在於判斷一個字串裏面是否存在該字符,須要遍歷子串,致使暴力的時間複雜度爲O(N^2),判斷一個字符是否存在於子串中能夠採用set集合判斷,這樣子串中判斷字符是否存在的時間複雜度爲O(1)

時間複雜度:O(2*N)=O(N),在最糟糕的狀況下,每一個字符將被 i 和 j訪問兩次。

空間複雜度: set的大小取決於字符串長度n和字符集的大小m,因此空間複雜度O(min(n,m))

class Solution { public: int lengthOfLongestSubstring(string str) { if(str=="") return 0; set<char> ss; int i=0,j=0,n=str.length(); int ans=-1; while(i<n&&j<n) { if(ss.find(str[j])==ss.end()) { ss.insert(str[j++]); ans=max(ans,j-i); }else { ss.erase(str[i++]); } } return ans; } };

執行時間:60 ms

方法二:採用map或者數組存儲每一個字符最後出現的索引位置,以便i跳躍式前進

在S[i]到S[j]內若是有字符s[k]重複於S[j+1]的話,若是採用set,i是逐漸增長的(每次前移1位),可是若是採用map存儲每一個字符最後出現的索引位置,這樣i能夠直接跳到k+1,屬於跳躍式前進

字符集大小:m

時間複雜度:O(2*N)=O(N)

空間複雜度:O(m)

class Solution { public: int lengthOfLongestSubstring(string str) { if(str=="") return 0; map<char,int> mm; int i=0,j=0,n=str.length(); int ans=-1; for(i=0,j=0;j<n;j++) { if(mm.find(str[j])!=mm.end()) { i=max(i,mm[str[j]]); } ans=max(ans,j-i+1); mm[str[j]]=j+1; } return ans; } };

執行時間:32 ms

 

方法三:採用數組存儲字符索引,start表明沒有重複子串的開頭

若是原來出現過的字符的位置大於start,那麼更新start

i-start=沒有重複子串的長度

該方法省去了在子串中利用map或者set查找是否存在某字符的操做,直接判斷一下當前字符出現過的最後位置是否大於start

時間複雜度:O(N)

空間複雜度:O(m),m爲字符集的大小

class Solution { public: int lengthOfLongestSubstring(string str) { vector<int> v(300,-1); int ans=0; int n=str.length(); int start=-1; for(int i=0; i<n; i++) { if(v[str[i]]>start) { start=v[str[i]]; } v[str[i]]=i; ans=max(ans,i-start); } return ans; } };

執行時間:8 ms

 

滑動窗口展現的動態圖片請參考:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-jie-suan-fa-3-wu-zhong-fu-zi-fu-de-zui-chang-z/

相關文章
相關標籤/搜索