面试题48:最长不含重复子串的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
// 滑动窗口
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len=s.size();
if(len==0)
return 0;
vector<int> hash(128,-1); // 用数组创建哈希表
int left=0,right=0;
int maxLen=0;
while(right<len)
{
if(hash[s[right]] != -1)
left=std::max(left,hash[s[right]]+1); // left为 "不含重复字符的字符串的第一个字符"在原字符串s中的下标,right为当前"不含重复字符的字符串的最后一个字符"在原字符串s中的下标,如果重复的字符的下标位置在当前"不含重复字符的字符串"中,则left下标要更新为该重复字符的下一个字符的位置(下标位置+1)。否则,left不需要更新,因为重复字符不在当前"不含重复字符的字符串"中。
hash[s[right]] = right; // 更新哈希表(遍历每个字符,都要更新该字符 最后在字符串s中出现的位置)
maxLen = std::max(maxLen,right-left+1);
right++;
}
return maxLen;
}
};