leetcode hot100

最长非重复字符串——滑动窗口

leetcode hot100_第1张图片
本题主要考双指针中的滑动窗口。滑动窗口是两个指针,同向运动,右指针移动,左指针满足条件时移动。在这个体中,右指针向右移动,当出现重复字母的时候,左指针需要改变位置。

public class LongestSubstringWithoutRepeatingCharacters {
    public static int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }

        int n = s.length();
        int maxLength = 0;
        HashMap charIndexMap = new HashMap<>();

        for (int i = 0, j = 0; j < n; j++) {
            char currentChar = s.charAt(j);

            if (charIndexMap.containsKey(currentChar)) {
                // 如果当前字符已经在窗口内存在,则更新窗口的起始位置
                i = Math.max(charIndexMap.get(currentChar) + 1, i);
            }

            // 更新当前字符的最新位置
            charIndexMap.put(currentChar, j);

            // 更新最大长度
            maxLength = Math.max(maxLength, j - i + 1);
        }

        return maxLength;
    }

比如 abac,此时左右指针都在索引为0的位置,字符a,不在map集合中,则将其放入集合中,map(‘a’:0);之后右指针向右移动,字符b,不在map中,将其放入map(‘a’:0,‘b’:1),此时,右指针j=1,左指针i=0。之后移动右指针,j=2,字符a,map中存在,则需要更新左指针,i = Math.max(charIndexMap.get(currentChar) + 1, i),i=1,j=2。继续移动右指针,j=3,i=1,字符是c,map中没有,则存入,map(‘a’:2,‘b’:1,‘c’:3),此时长度是3-1+1=3,到达尾部结束。
leetcode hot100_第2张图片

注意:

  1. 本题中需要注意左指针的移动条件以及移动位置,出现重复字符,把左指针移动到重复字符出现的第一次位置的下一个位置,去除掉第一个重复字符!
  2. 计算最大的长度的时候,需要记得比较全是重复元素的情况,这时就是0,如果不是都重复的情况,那么就是右指针减去左指针+1(+1是因为索引从0开始的)

你可能感兴趣的:(leetcode,算法,职场和发展)