《剑指offer》面试题48. 最长不含重复字符的子字符串

问题描述

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

 

示例 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 n = s.size();
        if(n < 2)return n;
        int left = 0,right = 0;
        unordered_map<char,int> windows;
        int ans = 0;
        char c1,c2;
        while(right < n)
        {
            c1 = s[right++];
            ++windows[c1];
            while(windows[c1] > 1)
            {
                c2 = s[left];
                --windows[c2];
                ++left;
            }
            ans = max(ans,right - left);
        }
        return ans;
    }
};

结果

执行用时 :36 ms, 在所有 C++ 提交中击败了50.16%的用户
内存消耗 :8.8 MB, 在所有 C++ 提交中击败了100.00%的用户
posted @ 2020-05-02 08:44  曲径通霄  阅读(108)  评论(0编辑  收藏  举报