详细见:leetcode/problems/implement-strstr
Java Solution: github
package leetcode;public class P028_ImplementStrStr {//AC 13ms 34.88%static class Solution {public int strStr(String s, String p) {int sn = s == null ? 0 : s.length();int pn = p == null ? 0 : p.length();//pn == 0, p match at index 0if (pn == 0) return 0;//sn == 0 and pn > 0 can not matchif (sn == 0) return -1;int si = 0, pi = 0, next[] = getNext(p, pn);while (si < sn) {if (s.charAt(si) == p.charAt(pi)) {si ++;pi ++;if (pi == pn) break;} else if (next[pi] == -1) {si ++;} else pi = next[pi];}return pi == pn ? si - pn : - 1;}public int[] getNext(String p, int pn) {//return short pif (pn < 2) return new int[] {-1};int bi = 0, fi = 2, next[] = new int[pn];next[0] = -1;next[1] = 0;while (fi < pn) {if (p.charAt(fi - 1) == p.charAt(bi)) {next[fi ++] = ++ bi;} else if (bi <= 0) {next[fi ++] = 0;} else bi = next[bi];}return next;}}
}
C Solution: github
/*url: leetcode/problems/implement-strstr/strStr_back: 6ms 36.36%strStr_kmp: 3ms 49.82%
*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>void print_array(int * nums, int numsSize) {int i = 0;for (i = 0; i < numsSize; i ++)printf("%d ", *(nums + i));printf("rn");
}int* _get_next(char* p, int pn) {int bi = 0, fi = 2, * next = NULL;if (pn < 2) {//return short pnext = (int *) malloc(sizeof(int) * 1);next[0] = -1;return next;}next = (int *) malloc(sizeof(int) * pn);next[0] = -1;next[1] = 0;while (fi < pn)if (*(p + fi - 1) == *(p + bi)) {next[fi ++] = ++ bi;} else if (bi > 0) {bi = next[bi];} else next[fi ++] = 0;return next;
}int strStr_kmp(char* s, char* p) {int sn = s == NULL ? 0 : strlen(s);int pn = p == NULL ? 0 : strlen(p);int * next = NULL;int si = 0, pi = 0;if (pn == 0) return 0;if (sn == 0) return -1;next = _get_next(p, pn);while (si < sn) {if (*(s + si) == *(p + pi)) {si ++;pi ++;if (pi == pn) break;} else if (next[pi] == -1) {si ++;} else pi = next[pi];}free(next);return pi == pn ? si - pn : -1;
}int strStr_back(char* s, char* p) {int i = 0, j = 0;char sc = '