题目:
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
解析:
方法一: 双指针的滑动窗口解法。
方法二: 对方法一进行优化。
参考答案:
class Solution{
public:
int lengthOfLongestSubstring(string s){
//方法一:滑动窗口
if(s.size() == 0)
return 0;
unordered_set<char> ms;
int maxLen = 0;
for(int L = 0, R = 0; L < s.size(); ++L){
while(R < s.size() && !ms.count(s[R])){
ms.insert(s[R]);
R++;
}
maxLen = max(maxLen, R - L);
if(R == L) break;
ms.erase(s[L]);
}
return maxLen;
//方法二:优化
int lengthOfLongestSubstring(string s){
if(s.size() == 0)
return 0;
int res = 0;
int left = -1;
vector<int> m(128, -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;
}
};