题目介绍

​ 题目链接:3. 无重复字符的最长子串 - 力扣(Leetcode)

​ 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

题目思路

​ 没啥好说的,一眼滑动窗口。。。

​ 以示例1为例,对于“abcabcbb”,定义两个指针( left 和 right ),初始都指向字符串0位置,两个指针之间的字符串即为当前找到的子串,right指针向右遍历,使用hashmap记录出现过的字符和字符最后一次出现的位置,当前字串出现重复字符时(即hashmap中存在当前right指向的字符),将left指针移动到重复字符的下一个位置即可(map.get(s.charAt(i)) + 1),遍历过程中记录字串长度最大值。

代码

class Solution {

  public int lengthOfLongestSubstring(String s) {

​    if (s.length() <=  1){

​      return s.length();

​    }

​    HashMap<Character, Integer> map = new HashMap<Character, Integer>();

​    int ans = 0;

​    int left = 0;

​    for(int i = 0; i < s.length(); i++){

​      if(map.containsKey(s.charAt(i))){

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

​      }

​      map.put(s.charAt(i), i);

​      ans = Math.max(ans, i-left+1);

​    }

​    return ans;

  }

}