題目描述
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 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;
}