LeetCode第三题

cuicuiv每日刷题—Leecode第三题

题目:无重复字符的最长子串(点击此处跳转原题)
题目描述:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

积累经验

  1. 涉及出现次数,联想可能用到散列表
  2. 涉及子串,考虑滑动窗口,即设置左右指针滑动确定子串区域

for (int i = 0; i < n; ++i) { //遍历n次实现
if (i != 0) {
****
}
while (k + 1 < n && !occ.contains(s.charAt(k + 1))) {
****
}
}
此循环实现了以下情况的移动
LeetCode第三题_第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第三题_第2张图片

你可能感兴趣的:(每日刷题)