题目
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
假设字符串中只包含从’a’到’z’的字符。
样例
输入:”abcabc”
输出:3

解法:双指针

分别用两个指针表示子字符串的头和尾,用哈希表记录字符出现的次数
尾指针向前移动一格:

  • 如果上一个子串中没有尾指针对应的字符,那么更新最大长度和哈希表
  • 如果存在对应的字符,那么向前移动头指针,直到当前尾指针对应的字符出现次数减为0

时间复杂度O(n),空间复杂度O(n)

  1. class Solution {
  2. public:
  3. unordered_map<char, int> h;
  4. int longestSubstringWithoutDuplication(string s) {
  5. int l = 0, r = -1, ans = 0;
  6. while (r + 1 < s.size()) {
  7. if (h[s[r + 1]] == 0) {
  8. h[s[++r]] = 1;
  9. ans = max(ans, r - l + 1);
  10. }
  11. else {
  12. h[s[l++]]--;
  13. }
  14. }
  15. return ans;
  16. }
  17. };