最长不含重复字符的子字符串

139 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

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

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • s.length <= 40000

思路

本题使用用哈希表滑动窗口进行解决。当哈希表中的数字为1时,代表改数字只在当前窗口中出现了一次,这时我们的滑动窗口右边界可以往后+1,当遍历到数字在哈希表的映射大于1时,说明其重复出现,我们应该缩短滑动窗口的左边界至当前的数字处。注意:在移动滑动窗口时,我们要把哈希表之前的数字都置为0,恢复它的初始状态,让其符合我们的题意。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        
        int length = s.size();
        if(length == 0) return 0;
        int N = 40010;
        int h[N];
        memset(h,0,sizeof h);
        int j=0, res = 0;
        for(int i = 0;i < length;i ++){
            int ch = s[i] ;
            int x = ch % 97; 
            h[x] ++;
            
            while(h[x] > 1)
            {
               
                h[s[j] % 97]--;
                //cout << j << " " << h[j]  << h[x] << endl;
                j++ ;
            }
            res = max(res, i - j + 1);
        }
        return res;
​
    }
};