比如说给定字符串“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);
- j = -1;
- i = 0;
- while (i < src_len && j < pat_len) {
- if (-1 == j || source[i] == pattern[j]) {
- ++i;
- ++j;
- } else {
- j = next[j];
- }
- }
- delete []next;
- if (j >= pat_len)
- return source + i - pat_len;
- return NULL;
- }
-
- bool isContainReverse(char* src, char* dst) {
- int src_len = strlen(src);
- int dst_len = strlen(dst);
- if (dst_len > src_len)
- return false;
- char* temp = new char[src_len * 2 + 1];
- sprintf(temp, "%s%s", src, src);
- bool rst = kmpSearch(temp, dst);
- delete []temp;
- return rst;
- }
-
- bool isReverseContain(char* src, char* dst) {
- int dst_contain_count = 0;
- int src_contain_count = 0;
- int src_len = strlen(src);
- int dst_len = strlen(dst);
- char ch = *dst;
- char* p = dst;
- while (*p) {
- if (ch != *p)
- break;
- dst_contain_count++;
- p++;
- }
- p = strchr(src, ch);
- while (p) {
- char* temp = p;
- src_contain_count = 0;
- while (*p) {
- if (ch != *p)
- break;
- src_contain_count++;
- p++;
- }
- p = strchr(p, ch);
- if (src_contain_count < dst_contain_count)
- continue;
- int i = temp - src + src_contain_count - dst_contain_count;
- int j = 0;
- while (j < dst_len) {
- if (src[i] != dst[j]) {
- break;
- }
- i = (i + 1) % src_len;
- j += 1;
- }
- if (j >= dst_len)
- return true;
- }
- return false;
- }
-
- int main(int argc, char* argv[]) {
- char src[] = "passportpasssportsssssport";
- char dst[] = "sssssportpassportpasssport";
- bool rst = isReverseContain(src, dst);
- if (rst)
- cout << "yes" << endl;
- else
- cout << "non" << endl;
- cin.get();
- return 0;
- }