天天看點

LeetCode 每日一題

3. 無重複字元的最長子串

給定一個字元串,請你找出其中不含有重複字元的最長子串的長度。

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/.

本題考察的知識點為滑動視窗,此處假設有一個字元串S = “abcabcaaa”,并且有i ,j 分别指向字元串頭的位置,當然我們還需要一個存儲字元的集合set。

//代碼實作
public int lengthOfLongestSubstring(String s) {
		//存儲資料的集合
        Set<Character> 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 每日一題

滑動視窗算法架構:

/* 滑動視窗算法架構 */
void slidingWindow(string s, string t) {
    unordered_map<char, int> 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++;
            // 進行視窗内資料的一系列更新
            ...
        }
    }
}
           

其中兩處…表示的更新視窗資料的地方,到時候你直接往裡面填就行了。