#include<iostream>
#include "Main.h"
using namespace std;
int* getNext(char *pattern,int len2) {
int* next = new int[len2];
if (len2<2) {
return NULL;
}
next[0] = -1;
next[1] = 0;
next[2] = pattern[0] == pattern[1] ? 1 : 0;
for (int i = 3; i < len2;i++) {
int index = i - 1;
while (index >=0 && pattern[next[index]]!=pattern[i-1]) {
index = next[index];
}
if (index<0) {
next[i] = 0;
}
else {
next[i] = next[index] + 1;
}
}
for (int i = 0; i < len2; i++) {
cout << next[i] +1 << ",";
}
return next;
}
int KMP(char *mainString,char *pattern,int len1,int len2) {
if (len2>len1) {
return -1;
}
int l = 0, i = 0;
int *next = getNext(pattern,len2);
while (i<len2 && l<len1) {
if (mainString[l]==pattern[i]) {
l++;
i++;
}
else if (i==0) {
l++;
}
else {
i = next[i];
}
}
return i == len2 ? l-i : -1;
}
int main() {
string a = "hello";
int len = a.length();
char mainString[] = "aabaabaataa";
int len1 = sizeof(mainString) / sizeof(char);
char subString[] = "taa";
int len2 = sizeof(subString) / sizeof(char);
cout << "\n" << KMP(mainString, subString, len1, len2);
}
#include<iostream>
using namespace std;
#include<vector>
class Solution {
public:
void getNext(vector<int>& next, string pattern) {
int len = pattern.length();
if (len < 2) {
next[0] = -1;
return;
}
next[0] = -1;
next[1] = 0;
for (int i = 2; i < len; i++) {
int index = i - 1;
while (index >= 0 && next[index] >= 0 && pattern[i - 1] != pattern[next[index]]) {
index = next[index];
}
if (index < 0) {
next[i] = 0;
}
else {
next[i] = next[index] + 1;
}
}
}
int strStr(string s, string pattern) {
int len1 = s.length();
int len2 = pattern.length();
if (s == pattern) {
return 0;
}
if (len2 == 0) {
return 0;
}
if (len2 > len1) {
return -1;
}
int i = 0;
int j = 0;
vector<int> next(pattern.size());
getNext(next, pattern);
while (i < len1 && j < len2) {
if (s[i] == pattern[j]) {
i++;
j++;
}
else if (next[j] == -1) {
i++;
}
else {
j = next[j];
}
}
return j == len2 ? i - j : -1;
}
};