Leetcode 无重复字符最长串问题

本文分享了一位西电学子在LeetCode上遇到的字符串处理问题——找到最长重复子串。作者首先尝试了暴力搜索的方法,但由于时间复杂度过高导致超时。然后,他转向使用移动窗口的策略,将问题转化为贪吃蛇和壁虎的结合,通过控制头部(字符串起始位置)和尾部(重复字符结束位置)来遍历所有可能的子串。最终,作者给出了简洁的代码实现,并指出这种方法的时间复杂度较低。

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

今天下午刷力扣遇到这么一道问题。看着挺简单(其实也挺简单)题主还是研究了一段时间才写出来的。

下面和大家分享一下我的思路。

题目是这样的

给出一个字符串 S,考虑其所有重复子串(S 的连续子串,出现两次或多次,可能会有重叠)。

返回任何具有最长可能长度的重复子串。(如果 S 不含重复子串,那么答案为 "1"。)

刚看到这道题想到的是暴力搜索,也就是便利所有子串,但如果自底向上算的话又未免太复杂了。

- 在这里我们不妨设母串的长度为n,那么如果想遍历出所有子串,如果用循环的简单嵌套的话,时间复杂度为n^{n},这未免有点离谱,但是头铁的我还是试了一下,结果疯狂超时。

- 而且作为勤快(懒惰)的西电学渣,我看稍微复杂一点的代码都挺头疼的。

以下就是我的分析。

思路:这是一道移动窗口问题,也可以理解成贪吃蛇和壁虎的结合体(字符串的头部是贪吃蛇,尾部是壁虎)不同的字符就是食物,被吃掉后字符串就增长,而相同的字符(尾部)就相当于荆棘,遇到荆棘小壁虎就会断掉一点尾巴(究竟断多少是这道题的核心)

那怎么进行循环呢:

首先让头不断地往前走,如果遇到了重复的字符,那么队列(可以理解为不断移动的数组)就要前移,直到不重复为止

这样可以遍历出所有符合条件的字串的长度

下面是我的代码

习惯用数组下标的xd可以尝试用数组表示法解一下,这里我就不给出下标表示的解法了(懒)

int lengthOfLongestSubstring(char * s){
    char *tail=s;
    char *head =s;
    char *p;
    int ans=0;
    while(*head!=0){                /*控制小蛇的头*/
        for(p=tail;p<head;p++){       /*控制壁虎的尾巴*/
            if(*p==*head){
                 tail =p+1;          /*在第一次重复出断尾巴,因为不可能有第二处 */
                break;
            }
        }
        ans =(head-tail+1)>ans?(head-tail+1):ans;    

        head++;
    }

    return ans;
}

这就是我的解法了,可以看出时间复杂度还是挺低的(n^{2});

各位老板给孩子点个赞把。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyp54123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值