【Leetcode】無重複字符的最長子串

用到的思想是【滑動窗口】

  • 維護一個隊列,使得隊列符合題目要求。例如字符串“pwwkew”,那麼隊列“pw”、“wke”可以,“pww”、“wkew”就不行。
  • 將不滿足要求的隊列中重複的字符移除隊列即可。
  • 假設一個原始、題目給定的字符串S1,我們通過兩個指針left、i 維護一個隊列S2, 設指針left指向S2左端,i指向S2的右端,當加入的字符與S2中的字符重複了,就更新left,使得【窗口】或【隊列】往右滑,去掉重複的字符。
  • 每次更新隊列的長度,更新最大值max,這樣最後的max就是答案。
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int left = 0;
        int max = 0;
        Map<Character,Integer> map = new HashMap<>();
        for(int i = 0; i < s.length(); i++){
            if(map.containsKey(s.charAt(i))){
                left = Math.max(left, map.get(s.charAt(i)) + 1);
            }
            max = Math.max(max, i - left + 1);
            map.put(s.charAt(i), i );
        }
        return max;
    } 
}

對一行代碼的解釋:

left = Math.max(left, map.get(s.charAt(i)) + 1);

直接left = map.get(s.charAt(i)) + 1,是不行的。直觀地解釋就是,可能會使得窗口錯誤的往左滑。 因爲 abba 這種情況當遍歷到索引i爲3時,由於b重複左指針left已經到了2,不能更新爲a的第一次位置+1(即0+1=1)
map中存放的是無須、不重複的鍵值對《字符,索引》。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章