【總結】字符串類型

1.滑動窗口

1.無重複字符的最長字串(leetcode 3

  • 題目描述:

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

示例 1:

輸入: "abcabcbb"
輸出: 3 
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。


示例 2:

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


示例 3:

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

  • 分析:

首先,我們需要知道什麼叫子串。在刷題的過程中,碰到了兩個概念:子串和子序列

  1. 子串:子串要求連續的,也就是連續的幾個字符組成。
  2. 子序列:只要是字符串中的字符就行,不需要連續

由子串的概念可以知道,我們需要一直維持一個區間搜索,來判斷其是否爲子串,然後再對其長度進行比較,獲得最大的長度。

  1. 我們需要維持一個區間搜索子串,區間有一個起始點(start)和一個終止點(end).
  2. 首先,固定start的位置,移動終止點,每移動一次,就需要判斷新增加的元素是否和區間內的元素重複。
  3. 如果重複,那麼我們需要找到重複的元素的下一個元素的位置,作爲我們新的開始,這是爲了維護子串的連續性。
  4. 當產生了新的子串,我們需要比較新的子串的長度,找到當前最大子串長度。
  5. 如果不重複,一直搜索到字符串的結尾。

注意:這裏需要查找新元素是否在區間內存在,那麼我們就可以藉助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. 最小窗口子序列

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章