【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中存放的是无须、不重复的键值对《字符,索引》。

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