给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
一开始想到的是,枚举开头和结尾拼凑出所有的字符串,然后分别求符合要求的长度
然后想用类似dp的方法进行优化,仔细想了下发现可以通过维护开头来动态更新符合要求的子串
虽然有两个循环,但复杂度为O(n)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int l=s.length();
int k[300]={0};
int x=0,ans=0; //x为开头,ans为结果
for(int i=0;i<l;++i)
{
k[s[i]]++;
if(k[s[i]]==2) //有重复的字符,更新一下开头,直到找到符合要求的开头
{
while(x!=i&&k[s[i]]==2)
{
k[s[x]]--;
x++;
}
}
ans=max(ans,i-x+1);
}
return ans;
}
};