请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
- s.length <= 40000
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int dp[40005]; //第i+1个元素记录第i个位置的不重复字符串的最大长度
int idx,cur; //重复字符的前一个的下标 重复字符的当前下标
unordered_map<char,int>mp;
dp[0]=0;
for(int i=0;i<s.length();i++){
if(mp.find(s[i])==mp.end())
idx=-1; //如果当前字符前面没有重复字符,就将重复字符的前一个下标赋值为-1
else
idx=(mp.find(s[i]))->second;//否则记录重复字符的前一个下标
cur=i; //重复字符的当前下标
mp[s[i]]=i; //修改重复字符的前一个下标
if(idx==-1||dp[i]<cur-idx){
dp[i+1]=dp[i]+1; //如果前面没有当前字符的重复字符或者前一个字符的最长不重复字符串的长度大于重复字符前后坐标之间的距离,则可以将当前字符添加到前一个最长无重复字符的最长字符串后面,则当前字符的最长无重复字符串的长度为前一个字符的最长无重复字符串长度+1
}else{
dp[i+1]=cur-idx;//否则,当前字符的无重复最长字符串长度为两个重复字符的前后距离
}
}
return *max_element(dp,dp+s.length()+1); //返回最大长度
}
};