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;
}
注意点
- KMP算法真的要下狠心搞懂prefix table的创建以及使用;
- 当
j
满足strlen(needle)
时,返回的i注意已经偏移了strlen(needle)
的长度,所以返回结果应该与strlen(needle)
按场景计算,特别注意i的+1 -1
; - 注意计算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,子问题2:max(j),if(f(n)==f(dp[n−1])for(j=0;j<=dp(n−1)+1;j++)
子问题2待情景分析;