指尖劃過的軌跡,藏着最細膩的答案~

題目:

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

示例 1:

輸入: s = "abcabcbb"
輸出: 3
解釋: 因為無重複字符的最長子串是 "abc",所以其長度為 3。注意 "bca" 和 "cab" 也是正確答案。

示例 2:

輸入: s = "bbbbb"
輸出: 1
解釋: 因為無重複字符的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: s = "pwwkew"
輸出: 3
解釋: 因為無重複字符的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

提示:

$0 \leq s.length \leq 5 \times 10^4$
$s$ 由英文字母、數字、符號和空格組成

分析:

AC代碼:


```> 指尖劃過的軌跡,藏着最細膩的答案~

## 題目:
給定一個字符串 `s` ,請你找出其中不含有重複字符的 **最長** 子串 的長度。

**示例 1**:

> 輸入: s = "abcabcbb" \
> 輸出: 3 \
> 解釋: 因為無重複字符的最長子串是 "abc",所以其長度為 3。注意 "bca" 和 "cab" 也是正確答案。

**示例 2**:

> 輸入: s = "bbbbb" \
> 輸出: 1 \
> 解釋: 因為無重複字符的最長子串是 "b",所以其長度為 1。

**示例 3**:

> 輸入: s = "pwwkew" \
> 輸出: 3 \
> 解釋: 因為無重複字符的最長子串是 "wke",所以其長度為 3。 \
> 請注意,你的答案必須是 **子串** 的長度,"pwke" 是一個子序列,不是子串。

**提示:**

> $0 \leq s.length \leq 5 \times 10^4$ \
> $s$ 由英文字母、數字、符號和空格組成

## 分析:
這是一個**最長子數組**的問題,對於這種**最長子數組/最短子數組**我們可以使用**不定長滑動窗口**來解決,初始左端點`l`為0,右端點`r`為1,遍歷數組`s`,移動右端點`r`,同時使用一個哈希表set來記錄每個字符出現的次數,如果右端點字符`s[r]`在哈希表中已經存在,則需要移動左端點直到與`s[r]`相同處,同時還需要記錄最大的哈希表的長度即為最終答案。

## AC代碼:
```c++
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        if (n == 0 || n == 1) return n; 
        int l = 0, r = 1;
        int ans = 0;
        unordered_set<int> st;
        st.insert(s[0]);

        while(r < n) {
            if (st.count(s[r])) {
                while (s[l] != s[r] && l < r) {
                    st.erase(s[l]);
                    l++;
                }
                l++;
            } else {
                st.insert(s[r]);
            }

            r++;
            ans = max(ans, (int)st.size());

        }

        return ans;
    }
};