给定一个字符串
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:
bool has_no_repeat_char(std::string &str)
{
for (auto &s : str)
{
if (std::count(str.begin(), str.end(), s) > 1)
return false;
}
return true;
}
int lengthOfLongestSubstring(string s) {
if (s.size() == 0 || s.size() == 1)
return static_cast<int>(s.size());
int max_length = 0;
int left = 0;
std::unordered_map<char, int> map;
for (auto right = 0; right < s.size(); ++right)
{
auto cr = s[right];
if (map.find(cr) != map.end() && map[cr] >= left)
{
// 前面已存在
left = map[cr] + 1;
}
map[cr] = right;
max_length = std::max(max_length, right - left + 1);
}
return max_length;
}
};
- 定义两个指针
left
和right
,分别表示无重复字符子串的左右边界。 - 初始化最大长度
max_length
为0,以及一个哈希表charMap
用于记录字符出现的位置。 - 遍历字符串,不断移动右指针
right
:- 如果当前字符
s[right]
已经在charMap
中出现过,并且上次出现的位置在当前无重复字符子串的范围内(即大于等于left
),则更新左指针left
为上次出现位置的下一个位置。 - 更新字符
s[right]
在charMap
中的位置为right
。 - 计算当前无重复字符子串的长度
cur_length = right - left + 1
。 - 更新最大长度
max_length
为max(max_length, cur_length)
。
- 如果当前字符
- 返回最大长度
max_length
。
发表回复