题目
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
C++代码
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
/*
* 滑动窗口解决无重复字符的最长子串问题
* 使用左右指针,遍历从每个元素开始寻找最长子串
* 无序set容器判断是否重复
*/
int lengthOfLongestSubstring(string s) {
int n = s.size();
int right = 0, ans = 0;
unordered_set<char> occ;
for (int left = 0; left < n; ++left) {
if (left != 0) {
occ.erase(s[left - 1]);
}
while (right < n && !occ.count(s[right])) {
occ.insert(s[right]);
++right;
}
ans = max(ans, right - left);
}
return ans;
}
int main() {
string s = "abcabcbb";
int ans = lengthOfLongestSubstring(s);
cout << "The max stringlen: " << ans << endl;
return 0;
}
分析
滑动窗口解决无重复字符的最长子串问题,使用左右指针,遍历从每个元素开始寻找最长子串,无序 set 容器判断是否重复。
问题
无序 set 容器的使用:http://c.biancheng.net/view/7250.html