Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
使用滑动窗口的思想来解决该问题:
比方说 abcabccc 当你右边扫描到abca的时候你得把第一个a删掉得到bca,
然后"窗口"继续向右滑动,每当加到一个新char的时候,左边检查有无重复的char,
然后如果没有重复的就正常添加,
有重复的话就左边扔掉一部分(从最左到重复char这段扔掉),在这个过程中记录最大窗口长度。
public class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer> indices = new HashMap<Character,Integer>();
int length = 0;
int start = -1;
int end = 0;
for(end=0; end < s.length(); end++){
char c = s.charAt(end);
if(indices.containsKey(c)){
int newstart = indices.get(c);
start = Math.max(start,newstart);
}
length = Math.max(length,end-start);
indices.put(c,end);
}
return length;
}
}