leetcode原题链接:无重复字符的最长子串
上一篇:HOT7-接雨水
题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
解题方法:滑动窗口,维持[left, right]中的所有字符出现的次数都是1。right指针后移用于探索是否存在更长的解,left指针向right指针靠近用于使得窗口内的元素满足要求。
C++代码
#include <map>
#include <vector>
#include <string>
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.size();
int max_len = 0;
int left = 0;
int right = 0;
std::map<char, int> mp;//记录每个字符出现的最后一个位置
while (right < n) {
char rvalue = s[right];
if (mp.count(rvalue) > 0) { //如果当前元素已经在数组中,则更新left指针的位置
left = std::max(left, mp[rvalue] + 1); //有无没有删除元素的动作,所以left本身可能已经在更大的位置了
}
mp[rvalue] = right; //更新rvalue对应的位置
max_len = std::max(max_len, right - left + 1); //计算当前最大值
right++;
}
return max_len;
}
};