请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
s.length <= 40000
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<unordered_set>
#include<unordered_map>
#include<map>
using namespace std;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int lenS = s.size();
int res = 0;
map<char, int> hash;
int dp = 0;
for(int curPos = 0; curPos < lenS; ++curPos){
int prePos = 0; // 上次出现的位置
if(hash.find(s[curPos]) == hash.end()){
// 没找到
prePos = -1;
}
else{
prePos = hash[s[curPos]]; // 记录上次出现的位置
}
hash[s[curPos]] = curPos; // 将当前节点加入hash表
if(dp < curPos - prePos){
// 上次出现的位置未在当前字串
++dp; // 当前位置为结尾的字串长度加一
}
else{
dp = curPos - prePos; // 当前字串长度为从上次出现的位置到当前位置
}
res = max(res, dp);
}
return res;
}
};