请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
s.length <= 40000
思路
参考Leetcode题解 中的双指针滑动窗口方法
大致思路是:保证窗口中不会存在重复的字符
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// 边界判断
if(s.length()< 2) return s.length();
int maxLen= 0;
map<char, int> mp;
int len= s.length();
int l= 0;
for(int i= 0; i< len; i++){
// 如果该字符之前已经出现过,并且位置在l后面,则将l移动,保证窗口中没有重复字符
if(mp.find(s[i])!= mp.end()){
auto it= mp.find(s[i]);
l= l> it->second? l: it->second+ 1;
}
mp[s[i]]= i;
maxLen= maxLen> i- l+ 1? maxLen: i- l+ 1;
}
return maxLen;
}
};