https://leetcode.com/problems/longest-substring-without-repeating-characters/
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
这道题一开始我就想用Hashtable做,就是如果遇到重复字符,那么回到上一个该重复字符出现的下一个位置重新开始,
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()==0) return 0;
int start = 0;
int max = 1;
while(start<(s.length()-1)){
int end = start+1;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
map.put(s.charAt(start), start);
while(end < s.length()){
if(map.containsKey(s.charAt(end))){
int localmax = end-start;
start = map.get(s.charAt(end))+1;
max = Math.max(max, localmax);
break;
}
else map.put(s.charAt(end), end);
end++;
}
if(end == s.length()) break;
}
return max;
}
结果超时了,后来发现其实不需要再检查两个重复字符之间的字符串了,因为它们已经被检查过了,肯定是不重复的。
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()==0) return 0;
int start = 0;
int end = 0;
int max = 1;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
while(end < s.length()){
if(map.containsKey(s.charAt(end)) && map.get(s.charAt(end))>=start){
max = Math.max(max, end-start);
start = map.get(s.charAt(end))+1;
}
map.put(s.charAt(end), end);
end++;
}
max = Math.max(max, end-start);
return max;
}
这样的话,判断一个字符是不是在start后面出现过,其实看它在hashtable中存储的出现点是在start前还是start后就行了。
所以后来发现原来直接用一个256的int数组就可以充当hashtable了。
public int lengthOfLongestSubstring(String s) {
if(s==null || s.length()==0) return 0;
int start = 0;
int end = 0;
int max = 1;
int[] index = new int[256];
Arrays.fill(index, -1);
while(end<s.length()){
if(index[s.charAt(end)]>=start){
max = Math.max(max, end-start);
start = index[s.charAt(end)] + 1;
}
index[s.charAt(end)] = end;
end++;
}
max = Math.max(max, end-start);
return max;
}