LeetCode題目詳解(二)——無重複字符的最長子串

題目描述

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

示例 1:

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

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

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-ch

思路解析

即目前出現的連續字符中不能存在重複字符,那就利用某種數據結構將從未出現的字符儲存下,並記錄當前串的長度,出現重複則刪除這個字符,這個字符後的子串成爲一個新串,繼續上述操作,最終取記錄的最大長度就是題目的解。問題就在於怎麼判斷重複,如果是數組或鏈表的話需要每次都從頭到尾掃描,時間複雜度很高。因此需要一種方法可以快速檢索,C++STL中的set可以解決快速檢索的問題。

完整code:

#include <bits/stdc++.h>

using namespace std;
class Solution
{
public:
    int lengthOfLongestSubstring(string s)
    {
        set<char> container;
        int left = 0;
        int result = 0;
        int index = 0;
        while(index < s.size()){
            if(container.find(s[index]) == container.end())
            {
                container.insert(s[index++]);
                result = max(result,(int)container.size());
            }
            else{
                container.erase(s[left++]);
            }
        }
        return result;
    }
};

int main()
{
    string s;
    cin>>s;
    Solution Sve;
    cout<<Sve.lengthOfLongestSubstring(s);
    return 0;
}

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