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

LeetCode刷题笔记-28.实现strStr

  • C代码
    • 注意点
      • prefix table 动态规划法(未完待续)
    • 结果
  • 题目

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]; 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 , if(f(n) == f(dp[n-1])  最优子问题 j 0.. d p [ n − 1 ] , pp[i-j] == pp[j] 子问题 dp(n)= \left \{\begin{array}{cc} dp(n) + 1, &\text{if(f(n) == f(dp[n-1])} &\text{ 最优子问题}\\ j_{0..dp[n-1]},&\text{pp[i-j] == pp[j]} &\text{子问题} \end{array}\right. dp(n)={dp(n)+1,j0..dp[n1],if(f(n) == f(dp[n-1])pp[i-j] == pp[j] 最优子问题子问题

子问题2,主要分析存在前缀和后缀都是字符相等重叠的情况

结果

LeetCode刷题笔记-28.实现strStr()_第1张图片

题目

LeetCode刷题笔记-28.实现strStr()_第2张图片

你可能感兴趣的:(算法刷题,leetcode,c语言,算法)