@Aryami
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:
输入: s = “”
输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
题解
- 第一个关键点是如何完成查找不重复字符串的过程。可以使用滑动窗口来实现这一过程。具体做法是设置两个指针,分别指向子字符串的两头,若右指针遇到的字符为重复字符,则记录当前窗口中字符串的长度,并将左侧指针调整到窗口中重复字符的后一位,继续移动右侧指针,直到走到字符串末尾。
- 第二个关键点是如何在子串中查找重复字符。可以使用**“unordered_set”**来实现。
这样的时间复杂度是 O ( n ) O(n) O(n)。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> occur;
int res=0, left=0;
int n=s.size();
for(int i=0; i<n; i++)
{
while(occur.find(s[i])!=occur.end())
{
occur.erase(s[left]);
left++;
}
occur.insert(s[i]);
res = max(res, i-left+1);
}
return res;
}
};
不知道为什么这么简单的题我写了三天:)