LeetCode 每日一题

3. 无重复字符的最长子串


给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/.

本题考察的知识点为滑动窗口,此处假设有一个字符串S = “abcabcaaa”,并且有i ,j 分别指向字符串头的位置,当然我们还需要一个存储字符的集合set。

//代码实现
public int lengthOfLongestSubstring(String s) {
		//存储数据的集合
        Set set = new HashSet<>();
        int i = 0, j = 0, maxLength = 0;
        while(i < s.length() && j < s.length()){
        //如果没有包含,则我们需要将其加入集合中,然后继续判断下一个
            if(!set.contains(s.charAt(j))){
                set.add(s.charAt(j));
                j ++;
            }else{
            //如果包含,则我们需要去除掉第一个元素,然后再判断是否仍然包含
                set.remove(s.charAt(i));
                i ++;
            }
            //最后的长度即为j - i 的长度(不+1的原因是因为判断完j不在以后,j++了一次)
            maxLength = Math.max(maxLength, j - i);
        }
        return maxLength;
    }

滑动窗口代码模板(以下内容出自公众号:labuladong作者:labuladong
附上公众号上的一首诗

LeetCode 每日一题_第1张图片

滑动窗口算法框架:

/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
    unordered_map need, window;
    for (char c : t) need[c]++;

    int left = 0, right = 0;
    int valid = 0; 
    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        // 右移窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        /*** debug 输出的位置 ***/
        printf("window: [%d, %d)\n", left, right);
        /********************/

        // 判断左侧窗口是否要收缩
        while (window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            // 左移窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}

其中两处…表示的更新窗口数据的地方,到时候你直接往里面填就行了。

你可能感兴趣的:(leetcode,字符串,leetcode,java)