cuicuiv每日刷题—Leecode第三题
题目:无重复字符的最长子串(点击此处跳转原题)
题目描述:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
积累经验:
- 涉及出现次数,联想可能用到散列表
- 涉及子串,考虑滑动窗口,即设置左右指针滑动确定子串区域
for (int i = 0; i < n; ++i) { //遍历n次实现
if (i != 0) {
****
}
while (k + 1 < n && !occ.contains(s.charAt(k + 1))) {
****
}
}
此循环实现了以下情况的移动
当i=0,右指针不断循环移动直至跳出判断条件 得出此次循环ans的值
当i=1 删除i=0处的字符即从第二个字符开始循环判断得出ans的值
当i=···································
每次循环刷新ans的值保证最终结果为最大值即最长无重复的子串
题目代码
class Solution {
public int lengthOfLongestSubstring(String s) {
// 哈希集合,记录每个字符是否出现过
Set<Character> occ = new HashSet<Character>();
int n = s.length();
int k = -1, ans = 0;
// 右指针,初始值为 -1,相当于在字符串的左边界的左侧,还没有开始移动
for (int i = 0; i < n; ++i) { //遍历n次实现
if (i != 0) {
// 左指针向右移动一格,移除一个字符
occ.remove(s.charAt(i - 1));
}
while (k + 1 < n && !occ.contains(s.charAt(k + 1)))
// 不断地移动右指针 判断条件为下次不越界&&下一字符没在集合中出现过
{
occ.add(s.charAt(rk + 1));
++k;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = Math.max(ans, rk - i + 1);
}
return ans;
}
此题设计到java.util包中Set接口
LeetCode第三题:无重复字符的最长子串解析
博客介绍了LeetCode第三题的解决方案,题目要求找到字符串中无重复字符的最长子串。文章提到可以使用滑动窗口和散列表的方法来解决,通过遍历字符串并更新左右指针来确定子串。代码实现中涉及到Java的Set接口。


1307

被折叠的 条评论
为什么被折叠?



