题目:3. 无重复字符的最长子串
给定一个字符串 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 由英文字母、数字、符号和空格组成
思路
感觉之前做过,本来不想发的,但感觉之前理解的不够好,还是再总结一下吧。采用滑动窗口的思想,先将left和right同时指向第一个字符;对每一个字符进行遍历,在left小于等于right时每次判断在left和right之间是否有重复字符,当没有重复字符时,right向后移动一位;有重复字符时,则将left移动到重复字符的下一位,这样可以保证left和right之间的字符串无重复字符。然后用max代表最长字符串的长度,在每一次遍历更新不重复字符串的长度即可。
代码(力扣的格式)
int lengthOfLongestSubstring(char * s){
int size=strlen(s);
int left=0,right=0;
int max=0;
int flag=0;
int j;
for(int i=0;i<size;i++){
if(left<=right){
flag=0;
for(j=left;j<right;j++){
if(s[j]==s[right]){
flag=1;
break;
}
}
if(flag){
left=j+1;
}
max=max<right-left+1?right-left+1:max;
right++;
}
}
return max;
}