0
点赞
收藏
分享

微信扫一扫

LeetCode刷题笔记-28.实现strStr()

新鲜小饼干 2022-04-17 阅读 48

LeetCode刷题笔记-28.实现strStr

C代码

int *get_prefix_table(char *pp, int psize) {
    int i = 0;
    int j;
    int *dp = NULL;

    dp = calloc(psize, sizeof(int));
    dp[0] = 0;
    for (i = 1; i < psize; i++) {
        if (pp[i] == pp[dp[i-1]]) {
            dp[i] = dp[i-1] + 1;
        } else {
            for ( j = 0; j <= (dp[i-1] + 1); j++) {
                if (pp[i-j] != pp[j]) {
                    break;
                }
            }
            dp[i] = j;
        }
    }
    return dp;
}

int strStr(char * haystack, char * needle){
    int *pp = NULL;
    int i, j;

    pp = get_prefix_table(needle, strlen(needle));
    j = 0;
    for (i = 0; i < strlen(haystack); i++) {
comp:
        if(haystack[i] == needle[j]) {
            j++;
            if(j == strlen(needle)) {
                return i + 1 - strlen(needle);
            }
            continue;
        }
        if(haystack[i] != needle[j]) {
            if(j > 0) {
                j = pp[j-1];
                goto comp;
            } else {
                j = 0;
                continue;
            }
        }
    }
    return -1;
}

注意点

  1. KMP算法真的要下狠心搞懂prefix table的创建以及使用;
  2. j满足strlen(needle)时,返回的i注意已经偏移了strlen(needle)的长度,所以返回结果应该与strlen(needle)按场景计算,特别注意i的+1 -1
  3. 注意计算prefix table的动态规划子问题划分;

prefix table 动态规划法(未完待续)

法1:
d p ( n ) = { 最 优 子 问 题 : d p ( n ) + 1 , i f ( f ( n ) = = f ( d p [ n − 1 ] ) 子 问 题 2 : m a x ( j ) , f o r ( j = 0 ; j < = d p ( n − 1 ) + 1 ; j + + ) dp(n)= \left \{\begin{array}{cc} 最优子问题:dp(n) + 1, &if(f(n) == f(dp[n-1]) \\ 子问题2:max(j), & for(j = 0; j <= dp(n-1)+1; j++) \end{array}\right. dp(n)={dp(n)+1,2max(j),if(f(n)==f(dp[n1])for(j=0;j<=dp(n1)+1;j++)
子问题2待情景分析;

结果

在这里插入图片描述

题目

在这里插入图片描述

举报

相关推荐

0 条评论