KMP

#include 
#include 
#include 

using namespace std;

char str1[1000001];
char str2[1000001];

void getNextArray(char *str, int *next) {
    int len = strlen(str);
    int k = -1;
    int j = 0; 
    next[0] = -1;
    while (j < len - 1) {
        if (k == -1 || str[j] == str[k]) {
            ++k;
            ++j;
            next[j] = k;
            //next[j] = (str[j] != str[k] ? k : next[k]);  // optimize
        } else {
            k = next[k];
        }
    }
}

int searchLongestSubString(char str1[], char str2[]) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int next[len2];
    int flag = 0;
    getNextArray(str2, next);
    int i = 0; // str1 index.
    int j = 0; // str2 index.
    while (j <= len2 - 1) {
        if (str1[i] == str2[j]) {
            i++;
            j++;
            if (j == len2) {
                return flag;
            }

        } else {
            i += j - next[j];
            flag = i;
            j = 0;
            if (i + len2 > len1) {
                break;
            }
        }
    }
    return -1;
}

int main() {
    scanf("%s%s", str1, str2);
    int result = searchLongestSubString(str1, str2);
    cout << result << endl;
    return 0;
}

你可能感兴趣的:(数据结构与算法分析)