KMP算法

KMP算法是测试智商的好办法,事实证明我智商捉急。

自己看思路写了好久才写出的代码,没有优化。


一个同学说我写的abcabaa最后一个出错了,由于没有照顾到前面有一堆相同然后有一个不同的情况。已经解决好了。


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void get_next(char *t, int len, int next[]) {

	next[0] = -1;
	int k = 0;
	int isHaveSameStrAndOneDiffChar = 0;
	for (int j = 1; j < len; ) {
		if (k == 0&& isHaveSameStrAndOneDiffChar==0) {
			if (t[j] == t[k]) {
				next[j] = k;
				j++;
				k++;
			}
			else {
				next[j] = 0;
				j++;
			}
		}
		else {
			if (isHaveSameStrAndOneDiffChar == 0) {
				if (t[j - 1] == t[k - 1] && t[j] == t[k]) {
					next[j] = k;
					j++;
					k++;
				}
				else if (t[j - 1] == t[k - 1] && t[j] != t[k]) {
					next[j] = k;
					j++;
					k = next[k];
					isHaveSameStrAndOneDiffChar = 1;
				}
			}
			else if(isHaveSameStrAndOneDiffChar == 1){
				
				if (t[j - 1] == t[k]) {
					k++;
					isHaveSameStrAndOneDiffChar = 0;
				}
				else {
					k = next[k];
					if (k == -1) {
						k++;
						isHaveSameStrAndOneDiffChar = 0;
					}
				}
			}
			
		}
	}

	for (int i = 0; i < len; i++) {
		printf("%d ", next[i]);
	}
	printf("\n");
}

int kmp(char *s, char *t) {
	int s_len = strlen(s);
	int t_len = strlen(t);
	int *next = malloc(t_len * sizeof(int));
	get_next(t, t_len, next);

	int i = 0, j = 0;
	while (i <= s_len - t_len) {
		int k = i;
		int j = 0;
		while (k < s_len && j < t_len) {
			if (j == -1) {
				i = k + 1;
				break;
			}
			else if (s[k] == t[j]) {
				k++;
				j++;
			}
			else
				j = next[j];
		}
		if (j == t_len)
			return i;
	}
	return -1;
}

int main() {
	char *s = "abcaabbabcabdacaabcaabbabcabaac";
	char *t = "abcaabbabcabaac";
	printf("%s", s+kmp(s, t));
}



你可能感兴趣的:(KMP算法)