中等
相关标签
相关企业
给定一个字符串 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
由英文字母、数字、符号和空格组成
错误版本:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int pos[256] = {-1};
int max_len = 0;
for (int left = 0, right = 0; right < s.length(); right++) {
int right_val = int(s[right]);
if (pos[right_val] < 0) {
pos[right_val] = right;
continue;
}
if (left < pos[right_val]) {
pos[right_val] = right;
continue;
}
max_len = std::max(max_len, right - left);
left = pos[right_val] + 1;
pos[right_val] = right;
}
return max_len;
}
};
正确版本:
思路:
- 创建256长度数组用于保存字符最后一次出现的位置
- 设置左右指针left和right
- 如果当前字符出现过,则记录一下right-left的长度,left移到当前字符之前出现的位置+1,并更新当前字符的位置;
class Solution {
public:
int lengthOfLongestSubstring(string s) {
std::vector<int> pos(256, -1);
int max_len = 0;
int left = 0;
int right = 0;
for (; right < s.length(); right++) {
int right_val = int(s[right]);
if (pos[right_val] < 0) {
pos[right_val] = right;
continue;
}
max_len = std::max(max_len, right - left);
left = pos[right_val] + 1;
pos[right_val] = right;
}
return std::max(max_len, right - left);
}
};