思路:使用滑动窗口的方法:用两个指针来确定未重复子串,计算长度。出现重复后将开始指针指向重复字符,再次获取子串并计算长度,直到整个字符串循环完成,每次唯一都要计算长度并且与原最长长度比较,循环完成即可获取最长长度。
初始开始下标为-1,在最前面,结束下面为0,在第一个字符,图解如下:
具体代码及代码解释如下
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s == "") {
return 0;
}
int start = -1;
int len = 0;
//用于记录字符下标
Map<Character, Integer> map = new HashMap<>();
for(int end = 0;end < s.length(); end++) {
char c = s.charAt(end);
//判断该字符是否已经出现过
if(map.containsKey(c)) {
//将开始指针移动到重复字符的下标,由于可能碰到类似abba的字符串,所以要获取大的下标
start = Math.max(map.get(c), start);
}
//每次长度变化都和原长度进行比较
len = Math.max(len, end - start);
//将当前字符和下标存入,如果重复则会顶替原来的字符
map.put(c, end);
}
return len;
}
}