给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
public int lengthOfLongestSubstring(String s) {
//
// int len = s.length();
// if(len == 0) return 0;
// // 注意:第一个数有坑 其位置等于0 //故数组初始化为-1 //隐藏坑点
// int[] tmp = new int[128];
// Arrays.fill(tmp,-1);
// int t=0,ans=0;
// for(int i=0;i<len;i++){
// if(tmp[s.charAt(i)]==-1 || i-tmp[s.charAt(i)]>t){//即重复不要紧
// t++;
// }else{
// t=i-tmp[s.charAt(i)];
// }
// tmp[s.charAt(i)]=i;
// ans = Math.max(t,ans);
// }
// return ans;
// 哈希表
// key 无序 唯一 ;value可重复
Map<Character,Integer> map = new HashMap<>();
int left = 0;// 记录滑动窗口的左端
int ans = 0;
for(int i=0;i<s.length();i++){
if(map.containsKey(s.charAt(i))){//出现过 更新左端
left = Math.max(left,map.get(s.charAt(i))+1); // 将窗口左端始终忘右更新
}
ans = Math.max(ans,i-left+1);
map.put(s.charAt(i),i);
}
return ans;
}