思路:
- 定义一个数组,用来标记前一个重复元素的位置
- 遍历字符,判断当前字符是否有重复,如果没有重复,那么将当前字符下标记录下来(该标记为-1或者该标记在起始位置前面)。如果重复,则计算起始位置到前一个字符的字符个数与之前无重复字符个数的最大值,然后将起始位置移到重复字符的下一个位置,将重复字符的位置改为当前字符下标。
- 有一种情况就是最后一个字符为非重复字符,需要特判。
class Solution {
public int lengthOfLongestSubstring(String s) {
int [] f= new int[128];
for (int i = 0; i < f.length; i++) {
f[i] =-1;
}
int max=-1,start=0,i,len = s.length();
char[] c = s.toCharArray();
for (i = 0; i < c.length; i++) {
//如果该元素没有重复
if (f[c[i]] == -1 || f[c[i]] < start) {
//将当前位置记录下来i
f[c[i]] = i;
}else{
max = Math.max(max, i - start );
start =f[c[i]] + 1;
f[c[i]] = i;
}
}
//最后一个字符不是重复字符的情况
if(i == len){
max = Math.max(max, i - start );
}
// 如果max为-1,那么该字符串就没有重复字符
if(max == -1){
return len;
}
return max;
}
}