代码随想录Day09

初始化

这里i表示后缀的末尾,j表示前缀的末尾
carl举例到j指向第二个a,i指向b的时候,我有点搞不明白为什么b是末尾:
后来想明白了:
其实此时计算前后缀长度的字符串是aab,那么此时这个字符串的前缀有a、aa,后缀是b,ab,注意,这里是ab,而不是ba,一开始会发蒙是因为觉得应该是倒着去记录后缀,实际上应该还是正着记,所以b才会是后缀的末尾。
在这里插入图片描述

疑惑点

  • 另外关于’aabaa’的最长相等前后缀长度为什么是2的解释?
    这里我其实犯了和上面那个相似的毛病。
    因为我认为这个字符串的后缀应该是:“a,aa,aab,aaba”,而前缀是:“a,aa,aab,aaba”,乍一看,最长长队应该是4啊。但实际上后缀应该是"a,aa,baa,abaa",之前的错就错在我是反过来记得,实际上,应该是按照后后面这样子记才对。

  • 回退的时候为什么要比前缀的末尾和后缀的末尾
    就拿初始化时候的“aba”举例,前缀末尾是b,前缀有:a,ab;后缀末尾是“a”(注意,不是b,千万记住怎么来记)。后缀有:ba,a;

  • j 同时表示的也是前后缀最大相等的值,所以,当s[i]和s[j]相等的时候,就应该让j++;

关键

最关键的是next数组这一前缀表的更新

  1. 前后缀长度不匹配
  2. 前后缀长度匹配
  3. 更新next数组

实现strStr

自己尝试了一下,超出时间限制了居然。。。
在这里插入图片描述

  • 首先next数组有两处错误
  1. j回退的时候应该等于next[j-1];
  2. while循环中应该指明j>0,
    在这里插入图片描述
    改了一会儿还有错误,太折磨了,先这样吧。明天接着找错误吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值