leetcode: 3无重复字符的最长子串。滑动窗口,c语言

给定一个字符串 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);

cpp 复制代码
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(;i<right;i++)//检查是否重复,右边界走一次就检查一次
        {
            if(s[i]==s[right])
            {
                left=i+1;//跳到该重复字符的下一个位置,因为s[i]==s[right]
                break;//重复就跳出循环
            }
        }   
     if(i==right)//完整的走完了循环才比较长度,删去这层if也行。
        {
            if(right-left+1>ans)//+1是因为,比如1-0=1,但是0------1是有两个元素的,即s[0]和s[1]
            {
                ans=right-left+1;
            }
        }
        right++;//右边界继续往前走
    }
    return ans;
}
相关推荐
To_OC1 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC1 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
To_OC2 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC3 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC3 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
To_OC5 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC7 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
Luminous.13 天前
C语言--day30
c语言·开发语言
玖玥拾13 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器