解题思路:滑动窗口问题,关键在于记录之前出现过的字符,当遍历过程中碰到之前出现的,就从之前出现的下一个作为start,实时比较当前值和最长值并赋值,最后返回最长值。java可以采用hashmap记录出现过的字符,value保存它的位置+1的值,作为出现重复的字符的时候的start的参考,取max(start,hashmap.get(str));或者用deque,当出现重复的字符就将之前的元素丢出直到丢出重复的那个字符为止,计算长度。
class Solution {public int lengthOfLongestSubstring(String s) {Map<Character,Integer> hashmap = new HashMap<>();int maxlen = 0;int start = 0;for(int end = 0;end < s.length();end++){char str = s.charAt(end) ;if(hashmap.containsKey(str)){start = Math.max(hashmap.get(str), start);}if(maxlen<end-start+1){maxlen = end-start+1;}hashmap.put(str,end+1);}return maxlen;}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
char[] strs = s.toCharArray();
Deque deque = new LinkedList();
int maxlen = 0;
//peek offer poll
for(char str:strs){
while(deque.contains(str)){
deque.pollLast();
}
deque.offerFirst(str);
if(maxlen<deque.size()) maxlen = deque.size();
}
return maxlen;
}
}