难度中等3341
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
思路:遍历字符串,利用hash表判断有无重复字符,同时更新最长子串长度max,如果有重复字符则找到重复字符的位置i,然后更新index起始位置为i+1(重复字符前面的字符都不用再参与计算了,包含他们的最长子串都不超过当前max)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char,int> hash;
int result = 0;
int index = 0;
for(int i=0;i<s.length();++i)
{
//如果找到重复的,并且这个重复值的index大于等于上一重复值索引,那么就去更新index
if(hash.find(s[i])!=hash.end() && hash[s[i]]>=index)
index = hash[s[i]]+1;
result = max(i-index+1,result);
hash[s[i]] = i;
}
return result;
}
};