思路

  1. 滑动窗口,设置left边界和最大值max,通过map来查询每个字符的下标
  2. 每当遍历到新的字符,分两步骤进行处理
  • map获取字符下标,如果没有存,则代表是非重复字符串,添加map并更新max值max = Math.max(right - left + 1, max)
  • 如果map已存在,更新窗口left = Math.max(left, indexOf(ch) + 1),并更新max = Math.max(right - left + 1, max)
class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 滑动窗口
        // 1. 设置窗口左边界和右边界,设置map记录字符和字符的最新(最大值)位置
        // 2. 右边界递增判断添加的元素i是否已经添加过,如果已经添加过则查看其最大值位置是否大于left,left = max(left, indexOf(i)),然后map更新i下标;没添加过则直接添加到map
        if (s.length() == 1) return 1;
        char[] chs = s.toCharArray();
        Map<Character, Integer> map = new HashMap();
        int left = 0;
        int max = 0;
        for (int i = 0; i < chs.length; i++) {
            if (map.get(chs[i]) != null) {
                left = Math.max(left, map.get(chs[i]) + 1);
                map.put(chs[i],i);
            } else {
                map.put(chs[i],i);
            }
	    max = Math.max(i - left + 1, max);
        }
        return max;
    }
}

Q.E.D.


每一个平凡的日常都是连续的奇迹