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;
}
};