初始化
这里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数组这一前缀表的更新
- 前后缀长度不匹配
- 前后缀长度匹配
- 更新next数组
实现strStr
自己尝试了一下,超出时间限制了居然。。。
- 首先next数组有两处错误
- j回退的时候应该等于next[j-1];
- while循环中应该指明j>0,
改了一会儿还有错误,太折磨了,先这样吧。明天接着找错误吧。