3. 无重复字符的最长子串(Leetcode刷题 滑动窗口法)
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
输入: s = “”
输出: 0
解题思路
这类型为了找到最大长度的题目,其实本质上就是滑动窗口法
滑动窗口法就是一个left指针,一个right指针,如果说right指针的内容出现在了字符串中,那么把左边的值依次剔除,直到right指针指示的值不出现在left到right之间(剔除时候需要lfet不断++)
然后将right指针指示的内容加入到left到right 的字符串中
解题是通过hash表求解,将字符串的元素对应到hash表中,查找使用hash.find(),剔除采用hash.erase()
解题代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//res表示找到的最长字符串
int res=0;
int n=s.length();
int left=0;
//hashtable表示hash表 unordered_set<>是hash表建立的方法
unordered_set<char> hashtable;
for(int right=0;right<n;right++){
//此处要使用的是while循环,因为要剔除到直到所选字符串中没有何right重复的元素
//hash.find()是查找,找不到的情况下返回的是hash.end()
while(hashtable.find(s[right])!=hashtable.end()){
//找到就剔除,hash.erase()
hashtable.erase(s[left]);
left++;
}
//将右边指针的数据加入hash表
hashtable.insert(s[right]);
res=max(res,right-left+1);
}
//返回的是最大长度
return res;
}
};
代码效率
执行用时:24 ms, 在所有 C++ 提交中击败了59.41%的用户
内存消耗:10.7 MB, 在所有 C++ 提交中击败了17.67%的用户
本文介绍了如何使用滑动窗口法解决LeetCode上的无重复字符的最长子串问题,通过C++代码实现了一个高效的解决方案。文章详细讲解了解题思路,包括利用哈希表进行查找和剔除操作,并给出了执行效率为24ms的代码示例。

458

被折叠的 条评论
为什么被折叠?



