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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode】无重复字符的最长子串【滑动窗口法】

發(fā)布時間:2025/7/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode】无重复字符的最长子串【滑动窗口法】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

示例 1:

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

示例 2:

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

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因為無重復(fù)字符的最長子串是 "wke",所以其長度為 3。
???? 請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

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

分析:

這三種方法都是屬于廣義上的滑動窗口法,只是采用的數(shù)據(jù)結(jié)構(gòu)以及一些操作有所不同

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

暴力的復(fù)雜度在于判斷一個字串里面是否存在該字符,需要遍歷子串,導(dǎo)致暴力的時間復(fù)雜度為O(N^2),判斷一個字符是否存在于子串中可以采用set集合判斷,這樣子串中判斷字符是否存在的時間復(fù)雜度為O(1)

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

空間復(fù)雜度: set的大小取決于字符串長度n和字符集的大小m,所以空間復(fù)雜度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; } };

執(zhí)行時間:60 ms

方法二:采用map或者數(shù)組存儲每個字符最后出現(xiàn)的索引位置,以便i跳躍式前進(jìn)

在S[i]到S[j]內(nèi)如果有字符s[k]重復(fù)于S[j+1]的話,如果采用set,i是逐漸增加的(每次前移1位),但是如果采用map存儲每個字符最后出現(xiàn)的索引位置,這樣i可以直接跳到k+1,屬于跳躍式前進(jìn)

字符集大小:m

時間復(fù)雜度:O(2*N)=O(N)

空間復(fù)雜度: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; } };

執(zhí)行時間:32 ms

?

方法三:采用數(shù)組存儲字符索引,start代表沒有重復(fù)子串的開頭

如果原來出現(xiàn)過的字符的位置大于start,那么更新start

i-start=沒有重復(fù)子串的長度

該方法省去了在子串中利用map或者set查找是否存在某字符的操作,直接判斷一下當(dāng)前字符出現(xiàn)過的最后位置是否大于start

時間復(fù)雜度:O(N)

空間復(fù)雜度: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;} };

執(zhí)行時間:8 ms

?

滑動窗口展示的動態(tài)圖片請參考: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/

轉(zhuǎn)載于:https://www.cnblogs.com/yinbiao/p/11271893.html

總結(jié)

以上是生活随笔為你收集整理的【LeetCode】无重复字符的最长子串【滑动窗口法】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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