指尖劃過的軌跡,藏着最細膩的答案~
題目:
給定一個字符串 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;
}
};