0
点赞
收藏
分享

微信扫一扫

力扣面试150 找出字符串中第一个匹配项的下标 KMP 子串匹配

五殳师兄 1天前 阅读 1

👩‍🏫 三叶题解

时间复杂度: O ( n + m ) O(n+m) O(n+m)

空间复杂度: O ( m ) O(m) O(m)

💖 Code

class Solution {
    // ss 原串
    // pp 匹配串(pattern)
    public int strStr(String ss, String pp) {
        if(pp.isEmpty()) return 0;

        int n = ss.length();
        int m = pp.length();
//      前置加空格 使得真正的串下标从 1 开始
        ss = " " + ss;
        pp = " " + pp;
        char[] s = ss.toCharArray();
        char[] p = pp.toCharArray();
        // next数组 与匹配串相关 
        int[] next = new int[m + 1];//next[i] 表示与当前后缀匹配的最长前缀的末尾元素的下标
        for(int i = 2, j = 0; i <= m; i++)
        {
            while(j > 0 && p[i] != p[j+1]) j = next[j];
            if(p[i] == p[j + 1]) j++;
            next[i] = j;
        }

        for(int i = 1, j = 0; i <= n; i++){
            while(j > 0 && s[i] != p[j+1])
                j = next[j];
            if(s[i] == p[j+1]) j++;
            if(j == m) return i-m;
        }
        return -1;
    }
}
举报

相关推荐

0 条评论