题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
LeeCode
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
int max = 0;//最大无重复子串
int left = 0;//左偏移位置
HashMap<String,Integer> map=new HashMap<>();
for(int i =0;i<s.length();i++){
String str = String.valueOf(s.charAt(i));
if(map.containsKey(str)){
left = Math.max(left,map.get(str)+1);//如果存在一样的话,偏移到重复的那一位,重新算
}
map.put(str,i);
max = Math.max(max,i-left+1);//在重复之前会计算最大无重复子串,如果重复之后会重新根据后面的子串去计算
//比如说abcabcbb,遍历到第二个a的时候,最长子串变成bca,如果是dvvf,遍历到第二个v的时候应该变成vf,
// left是重复英文的下一个标识,比如说abcabc这个,a重复之后,后面是有效的。
// 但是像dvvf,v重复之后,由于dv的v是在后面的,所以前面的值都废掉了
}
return max;
}
}
思考
max是最大的子串,left是如果重复需要移动,重新算,跟i遍历跟偏移的重新计算,如果比max大就替换max,不然的话意味着之前的子串更长。