思路:
首先从第一个字符开始往后计数,每次发现一个字符就这个字符出现的位置改成现在的位置,即map的val值是当前的位置
这个时候我们开始计数的位置还是0 即 j=0,
一旦我们往后不断更新最大的不重复子字符串的长度的时候,
第一个重复的字符出现了,
那么这个时候我们就要更新开始的位置了,
因为什么呢,因为我们的字符串里不能包含两个相同的字符,
这个时候要做的就是将字符开始的位置搬运到这个重复字符第一次出现的位置之后的那个位置上就可以了。
而我们怎么更新这个字符最新出现的位置呢?
在判断重复之后更新 最大的起始位置 起始位置只能大 不能小
Math.max(int a ,int b) :取最大值 ,包含边界值
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0) return 0;
int max=0;
HashMap<Character,Integer> map=new HashMap<>();
for(int i=0,j=0;i<s.length();++i)
{
if(map.containsKey(s.charAt(i)))
{
j=Math.max(j,map.get(s.charAt(i))+1);
// j用来表示下次开始查长度的起点
//第一个重复的字符出现了,那么这个时候我们就要更新开始的位置了
}
map.put(s.charAt(i),i);
max=Math.max(max,i-j+1);
}
return max;
}
}