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.
思路:引入Map记录已经存在的字符,记录好最长字符的开始、结束位置。o(2n)
public int lengthOfLongestSubstring(String s) {
if (null == s || s.length() == 0)
return 0;
int max = 1;
Map<Character, Integer> map = new HashMap<Character, Integer>();
int start = 0, end = 0, hit = 0;
while (end < s.length()) {
char next = s.charAt(end);
if (!map.containsKey(next)) {
map.put(next, end);
end++;
max = max < (end - start) ? (end - start) : max;
} else {
hit = map.get(next);
while(start<= hit){
map.remove(s.charAt(start));
start++;
}
map.put(next, end);
end++;
}
}
return max;
}
牛人的解法,不用清除map中的数据,o(n)
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max=0;
for (int i=0, j=0; i<s.length(); ++i){
if (map.containsKey(s.charAt(i))){
j = Math.max(j,map.get(s.charAt(i))+1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-j+1);
}
return max;
}