目录
题目描述:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
实现代码如下:
#include <iostream>
#include <string>
#include <unordered_set>
#include <algorithm>
using namespace std;
// 思路:采用哈希表和双指针的思路来找无重复的最长子串
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.empty()) {
return 0; // 判空
}
unordered_set<char> us; // 非排序无重复容器初始化
int maxLen = 0; // 最大标记量
int left = 0; // 左标记位置,i就是右指针
for (int i = 0; i < s.size(); i++) { // 对字符串进行遍历
// 如果容器内不存在当前判断字符并且不在最后一位,则进入循环,否则进行下一步
while (us.find(s[i]) != us.end()) { // 已经存在 就删除
us.erase(s[left]); // 清除最左边数据
left++; // 左标记点右移一位
}
maxLen = max(maxLen, i - left + 1); // 更新最大标记量
us.insert(s[i]); // 存入当前判断字符
}
return maxLen; // 返回最大标记量
}
};
int main()
{
Solution so;
string str1 = "abcabcbb";
string str2 = "bbbbb";
string str3 = "pwwkew";
cout << so.lengthOfLongestSubstring(str1) << endl;
cout << so.lengthOfLongestSubstring(str2) << endl;
cout << so.lengthOfLongestSubstring(str3) << endl;
return 0;
}