1.滑動窗口
1.無重複字符的最長字串(leetcode 3)
- 題目描述:
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
- 分析:
首先,我們需要知道什麼叫子串。在刷題的過程中,碰到了兩個概念:子串和子序列
- 子串:子串要求連續的,也就是連續的幾個字符組成。
- 子序列:只要是字符串中的字符就行,不需要連續。
由子串的概念可以知道,我們需要一直維持一個區間搜索,來判斷其是否爲子串,然後再對其長度進行比較,獲得最大的長度。
- 我們需要維持一個區間搜索子串,區間有一個起始點(start)和一個終止點(end).
- 首先,固定start的位置,移動終止點,每移動一次,就需要判斷新增加的元素是否和區間內的元素重複。
- 如果重複,那麼我們需要找到重複的元素的下一個元素的位置,作爲我們新的開始,這是爲了維護子串的連續性。
- 當產生了新的子串,我們需要比較新的子串的長度,找到當前最大子串長度。
- 如果不重複,一直搜索到字符串的結尾。
注意:這裏需要查找新元素是否在區間內存在,那麼我們就可以藉助hash表的特性。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty())
return 0;
unordered_set<char> word;
int slow=0;
int max_val=INT_MIN;
for(int i=0;i<s.length();i++)
{
//移動左指針,直到沒有和當前元素重複的位置
while(word.find(s[i])!=word.end())
word.erase(s[slow++]);
max_val=max(max_val,i-slow+1);
word.insert(s[i]);
}
return max_val;
}
};
3. 無重複字符的最長子串
30. 串聯所有單詞的子串
76. 最小覆蓋子串
159. 至多包含兩個不同字符的最長子串
209. 長度最小的子數組
239. 滑動窗口最大值
567. 字符串的排列
632. 最小區間
727. 最小窗口子序列