链接
题目
给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串 的长度。
示例1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。、
示例2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
思路1: 暴力解法。 从开始枚举,逐个枚举出子串,如何判断最符合的子串。
思路2: 滑动窗口。 用left和right两个指针来维护窗口,用一个nums哈希表来记录数据,用len来记录窗口长度。数据进窗口,然后nums更新。当nums中出现相同数据时,left向后移动,使数据出窗口,并更新nums。 当left 和 right 维护的窗口中的数据合法时,即nums中无相同数据时,更新, 将现窗口长度和 len 进行比较,窗口长度>len 则更新len。 然后left++,使数据进窗口。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left = 0 , right = 0;
int len = 0;
int nums[129];
for(int i = 0 ; i < 129 ; i++) nums[i] = 0;
while(right < s.size())
{
nums[s[right]]++;//每次有数据进入窗口时,对nums进行更新
while(nums[s[right]] == 2)
{
nums[s[left]]--;//更新nums
left++;//出窗口
}
len = (right - left + 1) > len ? (right - left + 1) : len;//更新len
//新数据进窗口
right++;
}
return len;
}
};