https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
解法:
package leetcode2;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* 2021/3/8 15:33
*
* @Author ayue
* 滑动窗口,把队列的左边的不符合条件的元素移出就行了
*/
public class Solution3 {
public int lengthOfLongestSubstring(String s) {
int start = -1;
int ans = 0;
//key为字符,value为字符的位置坐标
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
start = Math.max(map.get(s.charAt(i)), start);
}
ans = Math.max(i - start, ans);
map.put(s.charAt(i), i);
}
return ans;
}
public int lengthOfLongestSubstring2(String s) {
int ans = 0;
int right = -1;
Set<Character> set = new HashSet<Character>();
//左指针每移动一次就检测一次无重复字符子串,set中移除一个字符
for (int left = 0; left < s.length(); left++) {
if (left != 0) {
set.remove(s.charAt(left - 1));
}
//右指针每向右移动一次(字符不重复),set里添加一个字符。
while (right + 1 < s.length() && !set.contains(s.charAt(right + 1))) {
right++;
set.add(s.charAt(right));
}
//更新一下最大无重复字符子串
ans = Math.max(ans, right - left + 1);
}
return ans;
}
public static void main(String[] args) {
Solution3 s3 = new Solution3();
String s =
"dvdf";
System.out.println(s3.lengthOfLongestSubstring2(s));
}
}
问题:对于滑动窗口理解不够