Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequenceand not a substring.
最长不重复序列
自己写的O(n²)版本:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()<=1) return s.size();
int max_len=INT_MIN;
for(int i=1;i<s.size();i++){
unordered_set<char> set;
set.insert(s[i]);
for(int j=i-1;j>=0;j--){
if(set.find(s[j])==set.end())
set.insert(s[j]);
else
break;
}
int temp=set.size();
max_len=max(max_len,temp);
}
return max_len;
}
};
Discuss内的dp版本 O(n)的时间复杂度:
大概思路为 首先定义一个256大小的数组,因为ASCII下的字符串共有256个
然后记录一个left,每次遍历时都更新left与最大值即可
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> m(256, -1);
int res = 0, left = -1;
for (int i = 0; i < s.size(); ++i) {
left = max(left, m[s[i]]);
m[s[i]] = i;
res = max(res, i - left);
}
return res;
}
};