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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法

發布時間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 無重復字符的最長子串
    給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。
  • 示例 1:

    輸入: “abcabcbb”
    輸出: 3
    解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。
    示例 2:

    輸入: “bbbbb”
    輸出: 1
    解釋: 因為無重復字符的最長子串是 “b”,所以其長度為 1。
    示例 3:

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

    題解:
    樸素解法當然是考慮n^2算法,就是枚舉兩個端點,選出最優解
    是否可以優化?
    比如abcabcbb串中
    abcabcbb
    abc
    ??bca
    由abc直接跳到bca而不再暴力搜索 b,bc,是因為我們在abc這里就已經知道bc是符合條件的字串,只是由于a與新字符不滿足條件所以我們要拿掉a,防止重復考慮剩下的滿足條件的字符串,最終得到解.

    所以高效一點的解法就是用兩個指針分別指向滿足條件的左端和右端,若是滿足條件就讓右指針++前進,不滿足條件,就讓左指針++前進到滿足條件的位置繼續搜索,這個算法就是twopointer算法,也可以叫滑動窗口算法,因為這個算法left和right兩個指針走一遍序列就可以搜出最優解,所以是O(n).

    這個算法可以巧妙地避免中間已經比較過的序列,減少二次比較從而優化算法效率.
    我們可以保存一個當前子串中的字符的位置,如果這個字符之前遇到過,我們就讓left前進到這個之前遇到過的位置的后一個元素,讓后++的過程把這些字符都從我們的保存位置表中刪掉.這樣就能減少重復比較,沒必要讓left+1后再進行條件判斷.

    class Solution { public:map<char,int>bok;int lengthOfLongestSubstring(string s) {int left = 0,right = -1,maxlen=0;while(1){right++;if(right==s.length()){maxlen = max(maxlen,right-left);break;}if(bok.count(s[right])==0){bok[s[right]]=right;}else {maxlen = max(maxlen,right-left);int start = left;left = bok[s[right]]+1;while(start<left)bok.erase(s[start++]);bok[s[right]] = right;}}return maxlen;} };

    總結

    以上是生活随笔為你收集整理的力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。