题目
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
假设字符串中只包含从’a’到’z’的字符。
样例
输入:”abcabc”
输出:3
解法:双指针
分别用两个指针表示子字符串的头和尾,用哈希表记录字符出现的次数
尾指针向前移动一格:
- 如果上一个子串中没有尾指针对应的字符,那么更新最大长度和哈希表
- 如果存在对应的字符,那么向前移动头指针,直到当前尾指针对应的字符出现次数减为0
时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
unordered_map<char, int> h;
int longestSubstringWithoutDuplication(string s) {
int l = 0, r = -1, ans = 0;
while (r + 1 < s.size()) {
if (h[s[r + 1]] == 0) {
h[s[++r]] = 1;
ans = max(ans, r - l + 1);
}
else {
h[s[l++]]--;
}
}
return ans;
}
};