不含重复字符的最长子字符串
题目:输入一个字符串,求该字符串中不含重复字符的最长子字符的长度。
ASCII码总共有256个字符,因此用来模拟数组的长度就是256.
public int lengthOfLongestSubstring(String s){ //哈希表统计子字符串
if(s.length() == 0){
return 0;
}
int[] counts = new int[256];
int i = 0, j = -1;
int longest = 1;
int countDup = 0;
for (; i < s.length(); i++){
counts[s.charAt(i)]++;
if (counts[s.charAt(i)] == 2){
countDup++;
}
while (countDup > 0){
++j;
if (counts[s.charAt(j)] == 1){
countDup--;
}
}
longest = Math.max(i - j, longest);
}
return longest;
}
public int lengthOfLongestSubstrings(String s) { //滑动窗口
if(s.length() == 0){
return 0;
}
int[] last = new int[256];
for(int i = 0; i < 256; i++) last[i] = -1;
int res = 0;
int start = 0;
for(int i = 0; i < s.length(); i++) {
int index = s.charAt(i);
start = Math.max(start, last[index] + 1);
res = Math.max(res, i - start + 1);
last[index] = i;
}
return res;
}