leetcode-3无重复字符的最长字串

文章介绍了两种方法解决找到字符串中最长不重复子串的问题。第一种是暴力求解,通过四层循环检查所有子串,但效率低下。第二种方法是使用滑动窗口算法,通过两个指针i和j动态调整窗口范围,当找到重复字符时更新子串长度和指针位置,提高了效率。提供的代码示例展示了滑动窗口算法的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:暴力求解

思路:直接将该字符串的每一个字串都遍历一遍,查找出不重复的最大字串

带大家分析一下代码的大体写法,首先遍历字串要有两个下标,两层循环,这个大家都会,而判断字符串不重复,还是用两层循环,两两比较,看是否有重复的,而这四个循环是套在一起的,时间复杂度可想而知很大,不建议大家使用这种算法,代码就不写了。

下面讲一种更加简洁明了的算法

方法二:滑动窗口

顾名思意就是将指针动起来,来回滑动,确定区间

如下图

 有字符串abcabcdd,首先我们先定义两个指针 i、j,指向的空间看作是一个窗口,我们要先确定中间的子串是否重复,如果没有,j往后移,如果有i和j同时往后移

  当出现重复字符的时候,记录字串的大小,并将 i 移动到第一个重复字符的下一个字符处,可以节省时间

 如此反复,就可以得到最大不重复子串

代码如下

int lengthOfLongestSubstring(char* s) {
    if(*s=='\0')//空字符的情况
    return 0;
    int len = strlen(s);
    int i = 0, j = 1;
    int max = 1,count = 1;//max存放最大值,count是变化的字串长度
    while (i < len && j < len)
    {
        int k = 0;//寻找重复的字符
        for (k = i; k < j; k++)
            if (s[k] == s[j])
                break;
        if (k == j)//没找到
        {
            count++;
            j++;
            if (max < count)//只有在没找到的情况下才有可能大于已知的max
                max = count;
        }   
        else//找到重复字符
        {
            count=count-(k-i+1);//更新长度
            i=k+1;//更新下标
        }
    }
    return max;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值