LeetBook刷题笔记006:无重复字符的最长子串(Java实现)
自己的解
public int lengthOfLongestSubstring(String s) {
//使用HashSet集合判断是否存在重复元素
Set<Character> r = new HashSet<>();
//存储最大长度
int length = 0;
//右区间
int m =0;
//提前获取字符串长度提高性能
int n = s.length();
//存储每次区间的长度
int len = 0;
for(int i=0;i<n;i++){
//判断右区间临界和重复元素
while(m<n&&!r.contains(s.charAt(m))){
//添加长度并将该元素加入集合
len++;
r.add(s.charAt(m));
//不断遍历
m++;
}
//与历史区间长度比较获取最大值
length = Math.max(len,length);
//出循环代表右区间临界或出现重复则
//左区间不断前移去除重复元素后获取下一区间长度或跳出循环
r.remove(s.charAt(i));
//左区间前移当前临时区间减小
len--;
}
return length;
}
最优解:滑动窗口
public int lengthOfLongestSubstring(String s) {
Set<Character> occ = new HashSet<Character>();
int n = s.length();
//右区间
//初始化为-1可获取当前区间最大长度时的子串末尾索引
int rk = -1;
//存储最大长度
int ans = 0;
for (int i = 0; i < n; ++i) {
while (rk+1<n &&
!occ.contains(s.charAt(rk + 1))) {
occ.add(s.charAt(rk + 1));
++rk;
}
//当前区间长度可直接通过左右区间索引计算得到(更加简洁)
ans = Math.max(ans, rk - i + 1);
//左区间前移
occ.remove(s.charAt(i));
}
return ans;
}