给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成思路:双指针,右指针每前进一次,就从左指针开始检查一次,看从左指针开始到右指针前一个数(左闭右开区间)有没有和右指针相等的。如果没有,这就是一个无重复字符的子串,如果有就让左指针跳到这个字符的下一个位置,因为这个字符和右指针所在字符重复了。
检查结束之后,记录下长度。
时间复杂度O(n);
空间复杂度O(1);
int lengthOfLongestSubstring(char* s) {
if(!*s)//数组长度为0时直接返回0;
{
return 0;
}
int ans=1;//默认为1,如果数组长度不为0,那么最小为1。有更长的会覆盖1
int left=0;//窗口左边界
int right=1;//窗口右边界
while(s[right])
{int i=left;//检查是否重复的变量
for(;ians)//+1是因为,比如1-0=1,但是0——1是有两个元素的,即s[0]和s[1]
{
ans=right-left+1;
}
}
right++;//右边界继续往前走
}
return ans;
}