Sunday算法

首先i,j两个指针指示的位置(从头开始匹配),当发现失配的时候就判断子串的后一位在母串的字符是否在子串中存在? 若存在则将该位置和子串中的该字符对齐,再从头开始匹配;

若不存在 直接向后移动l2;

#include <bits/stdc++.h>

using namespace std;



int sunday(const char* text,const char* find)
{
    if (text == NULL || find == NULL)
    {
        return -1;
    }
    int map[CHAR_MAX];
    int i;
    int l1 = strlen(text);
    int l2 = strlen(find);
    if (l1 < l2)
    {
        return -1;
    }
    for (int i = 0;i<CHAR_MAX;i++)
    {
        map[i] = l2 + 1;
    }
    for (int i = 0;i<l2;i++)
    {
        map[find[i]] = l2 - i;
    }
    for (int i = 0;i<l2;i++)
    {
        cout << find[i] << "  " << map[find[i]] << endl;
    }
    i = 0;
    while (i <= (l1 - l2))
    {
        if (strncmp(find,text+i,l2) == 0)
        {
            return i;
        }
        else 
        {
            i += map[text[i+l2]];
            cout << i << endl; 
        }
    }
    return -1;
}
int main()
{
    char a1[] = "aaaaaaabca";
    char a2[] = "aab";
    cout << sunday(a1,a2);
    cout << CHAR_MAX << endl;
 } 
原文地址:https://www.cnblogs.com/yifi/p/6708900.html