力扣(LeetCode)小白刷题之路:无重复字符的最长子串
开始2021年的刷题之路,每日一题,坚持打卡,全为C,以后学了其他语言也会更新代码。都是比较基础易懂的代码,也是第一次写文章,希望能和各位大牛互相交流,也欢迎来交流思想。
第三题:无重复字符的最长子串
C
int lengthOfLongestSubstring(char * s){
if(s==NULL) return 0;
int max=0;
int left=0,right=0; //left 为左边界 right为右边界
int a[256]={0}; //该数组用来储存该字符出现的下一位置,使用字符对应的ASCII码来记录
while(s[right]!='\0'){
if(a[s[right]]>left){
left=a[s[right]];
}
if(max<right-left+1)
max=right-left+1;
a[s[right]]=right+1;
right++;
}
return max;
}
第三题知识点之滑动窗口
该题使用到的是滑动窗口,往往用于“请找到满足xx的xx子区间(子串、子数组)的xx”这类问题都可以使用该方法进行解决。
本题中 left 为左边界,right 为右边界。right++至字符串为 ‘\0’,a[256] 则储存s[right]字符出现的下一左边位置,当重复出现时,left则移动到为该字符的下一位置即a[ s[right] ] 的值,right的值只需要递增,因为重复只需要把重复的跳过就可以,只需要记录最大的子字符串的长度。