任何问题应该先考虑暴力解法。例如:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:
输入: s = “”
输出: 0
首先考虑暴力循环。过样例1,暴力循环遍历,abca时出现问题:
解决方案:记录现在字串的长度=3,删a走bca
示例3,当pww出现问题的时候:
解决方案:记录现在字串的长度=2,删pw从wke走
所以,我们需要什么?
需要一个记录无重复字串数量的变量:
int maxstr=0;
需要一个刚开始暴力遍历的for循环,一个记录字串左端点的指针:
int left=0;
for(int i=0;i<s.size();i++)
{
}
需要一个记录无重复字串里的元素容器:(C++STL容器),和一定添加遍历到的元素的方法:
unordered_set<char> look_up;
look_up.insert(s[i]);
需要一个删除从left指针起头一直删到重复元素的方法:
while(look_up.find(s[i])!=look_up.end())
{
look_up.erase(s[i]);
left++;
}
做完操作后刷新最大值:
maxstr=max(max,i-left+1);
题解:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0)
{
return 0;
}
int maxa=0;
int left=0;
unordered_set<char> look_for;
for(int i=0;i<s.size();i++)
{
while(look_for.find(s[i])!=look_for.end())
{
look_for.erase(s[left]);
left++;
}
maxa=max(maxa,i-left+1);
look_for.insert(s[i]);
}
return maxa;
}
};
性能:
执行用时:
28 ms
, 在所有 C++ 提交中击败了
42.37%
的用户
内存消耗:
10.7 MB
, 在所有 C++ 提交中击败了
18.08%
的用户
通过测试用例:
987 / 987