给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
思路:滑动窗口,有左右两个指针。
右指针移动,如果指向非重复字符,标记该字符在ASCII码中的位置。
右指针+1,计数器+1,更新结果。
如果指向重复字符,重置左指针指向的字符在ASCII码中的位置。
左指针+1,计数器-1。
循环条件是右指针小于字符串的长度。
int lengthOfLongestSubstring(char * s){
int left=0,right=0;//左右指针
int ans=0,num=0;//结果和计数
int tmp[128]={0};//用128位数组记录字符是否出现
while(right<strlen(s))//循环条件是右指针小于字符串长度
{
if(0==tmp[s[right]])//右指针指向的字符未出现
{
tmp[s[right]]=1;//标记该字符在ASCII码中的位置
right++;//右指针右移
num++;//计数器+1
ans=ans>num?ans:num;//更新结果
}
else//右指针指向的字符出现过
{
tmp[s[left]]=0;//左指针指向的字符的ASCII码不再记录在tmp中
left++;//左指针右移
num--;//计数器-1
}
}
return ans;//返回最终结果
}
如果对您有帮助的话点个赞呗~