思路:使用双向队列。遍历字符串,如果队列不包含当前字符,则将该字符添加到队列末尾;如果队列已经包含了当前字符,首先记录当前队列长度,然后将队列该字符之前的所有字符全部弹出,然后将当前字符添加到队列末尾,维持队列不出现重复的字符。
public int lengthOfLongestSubstring(String s) {
if(s==null||s.length()==0) return 0;
int answer=0;
int length=s.length();
LinkedList<Character> window=new LinkedList<>();
for(int i=0;i<length;i++){
if(window.contains(s.charAt(i))){
//若包含当前字符,记录当前答案,将该字符之前的所有元素全部弹出
answer=answer<window.size()?window.size():answer;
while(!window.isEmpty()&&window.poll()!=s.charAt(i));
}
//当前字符添加到队列的末尾
window.add(s.charAt(i));
}
//当整个字符串都没有重复的元素,这一句就发挥作用了
return Math.max(answer,window.size());
}