public int lengthOfLongestSubstring(String s) { if(s == null || s.length() == 0) return 0; char[] target = s.toCharArray(); int tail, head; tail = 0; Map<Character, Integer> map = new HashMap<Character, Integer>(); map.put(target[0], 0); int maxSubstringNum = map.size(); for(head = 1; head < s.length(); head++) { if(map.containsKey(target[head])) { int tmp = map.get(target[head]); for(int i = tail; i <= tmp; i++) { map.remove(target[i]); } tail = tmp + 1; map.put(target[head], head); } else { map.put(target[head], head); } if(map.size() > maxSubstringNum) { maxSubstringNum = map.size(); } } return maxSubstringNum; }