杠精派
派聪明
0/512

热门评论

langjiyunmie 2025年08月19日 12:40
我想知道这个滑动窗口如果标记的字母是在中间呢,怎么办
点赞
回复1 取消回复
溯问 2026年01月18日 16:14
用哈希表来维护的,每次新增的字母会进行查表
点赞
回复 取消回复

2 条评论

灵巧的皮皮虾 2026年03月08日 16:39
if (book[********(j)]) { break; } @派聪明 这块有没有问题
点赞
回复1 取消回复
派聪明 2026年03月08日 16:40
这段代码在**解法中**没有问题**,但需要理解其作用和上下文: ### 代码作用分析 ```java if (book[********(j)]) { break; } ``` 1. **book数组**:用于标记字符是否在当前子串**现过(`true`表示已出现) 2. **逻辑流程**: - 内层循环从当前位置 `i` 向前遍历(`j` 从 `i` 递减到 `0`) - 遇到已标记的字符(`book[********(j)] == true`)时立即终止内层循环 - 未标记的字符会被标记为 `true`(`book[********(j)] = true`) ### 为什么没有问题? 1. **每次外层循环重置book数组**: ```java for (int i = 0; i < ********(); i++) { boolean[] book = new boolean[128]; // 每次i变化都重置 ``` 这保证了每次**都是针对新的子串起始位置 `i` 2. **正确检测重复字符**: - 当遇到重复字符时(如 `s = "abca"`,第二次遇到 `'a'`) - `book['a']` 已为 `true`,触发 `break` 结束当前子串** - 此时 `i-j+1` 计算的是 `"bc"` 的长度(正确结果) 3. **与标记逻辑的配合**: ```java book[********(j)] = true; // 先标记字符 res = ********(res, i - j + 1); // 再更新长度 ``` 标记操作在**之后,确保首次遇到字符时不会误判 ### 示例验证 以 `s = "abcabcbb"` 为例: - 当 `i=3`(第二个 `'a'`): - `j=3`:`book['a']=false` → 标记为 `true`,长度=1 - `j=2`:`book['c']=false` → 标记为 `true`,长度=2 - `j=1`:`book['b']=false` → 标记为 `true`,长度=3 - `j=0`:`book['a']=true` → 触发 `break`,结束** - 最终得到子串 `"bca"`,长度=3(正确) ### 关键点 1. **book数组的作用域**:每次外层循环创建新数组,避免跨子串的干扰 2. **break的时机**:在检测到重复字符时立即终止,避免无效** 3. **标记顺序**:先**后标记,确保首次遇到字符时正常处理 这段代码是**解法的核心逻辑,通过重置book数组确保每次**的独立性,正确检测子串中的重复字符。
点赞
回复 取消回复
langjiyunmie 2025年08月19日 12:40
我想知道这个滑动窗口如果标记的字母是在中间呢,怎么办
点赞
回复1 取消回复
溯问 2026年01月18日 16:14
用哈希表来维护的,每次新增的字母会进行查表
点赞
回复 取消回复

目录