KMP算法 Java实现

Problem: 28. 找出字符串中第一个匹配项的下标

解题方法

  1. 构建next串
  2. 回溯查找next串,最后下标

思路

  1. 通过最大前缀后缀能找到下一次未查找到后要回溯的位置

构建next数组

无论如何第一个数的下一次回溯位置肯定是0,因此next[0]=0
这里的 j表示前缀起始位置 i表示后缀起始位置
如果找到字符不相同到的话,就让他一直回溯找,并且回溯赋值j = next[j-1]
能找到相同字符的话就直接i++,j++,并且把next[i] = j
这里先写while判断不相同 后写相同,是因为不相同的终点
一定是有相同的后缀或者直接结束查找(到了字符串末尾)

回溯查找

其实和上面的思路差不多,不能查找相同字符就一直回溯,能的话就共同前进,直到j到了模式串长度
这时因为i也在前进,所以i的下标是 应该返回的下标+(匹配串的长-1)

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(m+n)$

空间复杂度:

添加空间复杂度, 示例: $O(m)$

Code

class Solution {

    public int strStr(String haystack, String needle) {
        return new KMP(needle).search(haystack);
    }

    public class KMP {
        private String pattern;   // 模式串
        private int[] next;
        public KMP(String pattern){
            this.pattern = pattern;
            int m = pattern.length();
            // 创建next 数组
            next = new int[m];
            next[0] = 0;
            for(int i = 1,j=0; i < m; i++){
                while(j>0&&pattern.charAt(i)!=pattern.charAt(j)){
                    j = next[j-1];
                }
                if(pattern.charAt(i) == pattern.charAt(j)){
                    j++;
                }
                next[i] = j;
            }
        }

        public int search(String text){
            int j = 0;
            for(int i=0;i<text.length();i++){
                while(j>0&&text.charAt(i) != pattern.charAt(j)){
                    j = next[j-1];
                }
                if(text.charAt(i) == pattern.charAt(j)){
                    j++;
                }
                if(j == pattern.length()){
                    return i-pattern.length()+1;
                }
            }
            return -1;
        }
    }

}

本文作者:XFS小风

本文链接:https://www.cnblogs.com/xiaofengs/p/18140402

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   XFS小风  阅读(63)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.

作词 : Marc-André Brunelle

作曲 : Marc-André Brunelle

La fanfare frémit au carrefour de ta forme

Martellant sa poésie diforme

C'est l'eau de vie dans la sève, la conscience qui s'achève

Témoin de ta vision, auditeur de ta prison

Et quand tu briseras ta cage

On ira à la foire

On tournera la page et

Tu serreras mon corps

On partira à la nage

On aura la mer à boire

Tu manques pas de courage

Alors viens jouer dehors

Alors viens jouer dehors

Je te gribouillerai des cartes comme un grand explorateur

Pour les moments ou tu t'écartes, que ça te fasse moins peur

Ça t'empêche de rire, ça t'impose le pire

Témoin de ta vision, auditeur de ta prison

Et quand tu briseras ta cage

On ira à la foire

On tournera la page et

Tu serreras mon corps

On partira à la nage

On aura la mer à boire

Tu manques pas de courage

Alors viens jouer dehors

Et quand tu briseras ta cage

On ira à la foire

On tournera la page et

Tu serreras mon corps

On partira à la nage

On aura la mer à boire

Tu manques pas de courage

Alors viens jouer dehors

Alors viens jouer dehors