给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度
这道题就是理清一个逻辑 (我也是看答案明白的会了就行) 遍历以及遍历操作是不同的 有了这个思想就容易理解了
//壳子
public int XXX(String s){
// 构建 非重复容器 虽然用不到 但是有一点 hash的查询是最快的 或者说是 比数组的查询快的多
Set<Character> set = new HashSet<>();
// 构建 所需变量
int max = 0 , n = s.length() , rk = -1;
// 遍历目标
for(int i = 0; i< n ; i ++){
// i 不等零说明 已经找到当前位置 不重复最长子串
if( i! = 0 ){
//移除前一个 也就是 从字符串首位开始移除至 下一个不重复最长子串首位
//可以说是遍历思想的一种 永远排除不需要的字符
set.remove(s.chaAt( i -1 ))
}
// 进行遍历操作
// rk 是一个标示位 看个人怎么理解 用 -1 比较方便 +1 比较 n +1比较下一位
while (rk+1<n && !set.contains( rk+1)){
// 当满足不越界 并且 容器中未重复条件后
set.add(s.charAt( ++ rk));
}
//当遍历操作结束后 一定是出现重复元素或者达到最值 然后进行最大值 计算
max = max>(rk - i +1 )? max:(rk -i +1);
}
// 循环结束后 返回最值
return max;
}