Leetcode题库 3.无重复字符的最长子串(滑动窗口 C实现)

文章目录

  • 一、解析
  • 二、思路
    • 1、流程
    • 2、优化方向
    • 2、例子
  • 三、代码

一、解析

lengthOfLongestSubstring(char * s)
滑动窗口s[low,high]为无重复字符串
low为滑动窗口的开端
high为滑动窗口的末端
ret为滑动窗口的最大长度

二、思路

1、流程

遍历字符串s,并在滑动窗口s[low,high]中搜寻s[i]
若滑动窗口中存在一个s[j]==s[i],则low=j+1,high=i
若不存在,表明字符串”滑动窗口+s[i]”为无重复字符串,则high=i
判断滑动窗口最大长度ret是否小于high-low+1,若成立,则ret=high-low+1

2、优化方向

在第一步中,利用哈希数组存放滑动窗口中的数据
字符的ascii码作为下标
若字符在滑动窗口存在,则其存储的是该字符字符串s的下标;若不存在,则其存储的是-1
优势:不需要遍历滑动窗口查找s[i],利用哈希数组可直接判断s[i]是否在滑动窗口中,并且直接返回其在字符串s中的下标
劣势:哈希数组需要占据额外的内存空间

2、例子

初始条件
s=“abca”
low=0
high=-1
ret=high-low+1=0

遍历开始
i=0
在滑动窗口s[0,-1]搜寻s[i]
滑动窗口为空,未搜寻到”a”
于是将s[i]加入滑动窗口,high=0,则当前滑动窗口为“a”
又因为ret

i=1
在滑动窗口s[0,0]搜寻s[i]
滑动窗口为”a”,未搜寻到”b“
于是将s[i]加入滑动窗口,high=1,则当前滑动窗口为“ab”
又因为ret

i=2
在滑动窗口s[0,1]搜寻s[i]
滑动窗口为”ab”,未搜寻到”c”
于是将s[i]加入滑动窗口,high=2,则当前滑动窗口为“abc”
又因为ret

i=3
在滑动窗口s[0,2]搜寻s[i]
滑动窗口为”abc”,搜寻到”a”,下标为0
于是,low=0+1,high=2,则当前滑动窗口为“bca”
又因为ret=high-low+1,于是有ret不变

三、代码

int lengthOfLongestSubstring(char * s){
    int l=strlen(s),low=0,high=-1,ret=high-low+1;
    for(int i=0;i<l;i++){
        for(int j=low;j<=high;j++){
            if(s[i]==s[j]){
                low=j+1;
                break;
            }
        }
        high++;
        if(ret<=high-low+1) ret=high-low+1;
    }
    return ret;
}

你可能感兴趣的:(Leetcode刷题集,leetcode,算法)