自学内容网 自学内容网

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

Problem: 28. 找出字符串中第一个匹配项的下标
在这里插入图片描述

👩‍🏫 三叶题解

时间复杂度: 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;
    }
}

原文地址:https://blog.csdn.net/lt6666678/article/details/137889648

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!