比如说给定字符串“ABCD"通过循环移位是否可以包含“CDAB”。
有两种方法,一种方法就是通过创建另外一个字符串,这个字符串是两个“ABCD”的连接,然后应用kmp在新创建的字符串中查找"CDAB",这样的时间复杂度是O(n), 空间复杂度也是O(n),还有另外一种方法是可在O(n)时间内完成,下面给出代码:
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
void getNext(char* pattern, int length, int* next) {
int i = 0;
int j = -1;
next[i] = -1;
while (i < length - 1) {
if (-1 == j || pattern[j] == pattern[i]) {
++i;
++j;
if (pattern[i] == pattern[j]) {
next[i] = next[j];
} else {
next[i] = j;
}
} else {
j = next[j];
}
}
}
char* kmpSearch(char* source, char* pattern) {
int src_len = strlen(source);
int pat_len = strlen(pattern);
int i, j;
int* next = new int[pat_len];
for (i = 0; i < pat_len; i++)
next[i] = 0;
getNext(pattern, pat_len, next);