给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
示例一:
示例二:
示例三:
思路分析:
首先定义一个Set集合存储多个字符,同时定义一个右指针rk=-1,外层套一个循环定义左指针的初始位置,从0-s.length()-1,如果右指针右移一位后指向的元素不在集合中,且在字符串长度的范围内
,则将该字符串加入该字符集合,然后rk++,直至rk+1与集合中的元素重复则跳出循环,然后比较左右指针的跨度与max的大小,选择二者中较大的一个。比较完毕后,继续向右移动左指针的位置,继续上述的判断,但要注意,只要左指针不指向索引为0的位置,则需要首先移除集合中最左边的元素。
代码展示:
class Solution {
public int lengthOfLongestSubstring(String s) {
//定义一个承载字符的集合
Set<Character> set=new HashSet<>();
int length = s.length();
//右指针
int rk=-1;
int max=0;
for (int i=0;i<length;i++){
if(i!=0){
//将集合中最左边的元素
set.remove(s.charAt(i-1));
}
while(rk+1<length && !set.contains(s.charAt(rk+1))){
set.add(s.charAt(rk+1));
//右指针继续右移
rk++;
}
max=Math.max(max,rk+1-i);
}
return max;
}
}