Sunday查找

直接看代码吧懒得打字

int Sunday(char* src,char* arr)
{
    if(src == NULL || arr == NULL) return -1;
    //申请辅助数组,用空间换时间,省去遍历的过程
    char* ptemp = (char*)malloc(sizeof(char)*256);
    memset(ptemp,-1,sizeof(char)*256);
    int size = strlen(arr);
    int length = strlen(src);
    //子串中的元素从左到右赋值到数组中
    //通过字符可以直接得到它在子串中的位置
    int i;
    for(i=0;i<size;i++)
        ptemp[arr[i]] = i;

    int j=0;
    int index = 0;
    int k;
    for(i=0;i<length;)
    {
        //如果子串元素和父串元素相等,两个一起向后走
        if(src[i] == arr[j])
        {
            j++;
            i++;
            if(j == size)
                break;
        }
        else
        {
            //看子串对应主串的下一个在不在子串里 
            if(i-j+size < length)
            {
                //i-j-size是从开始加一个子串长度的下标
                //k是查找的字符在子串中的下标
                k = ptemp[src[i-j+size]];
                //重新给i赋值,再开始匹配
                i = i-j+size-k;
                //子串也从头开始
                j = 0;
            }
        }

    }

    if(j == size)
        return i-size;
    return -1;

}
原文地址:https://www.cnblogs.com/TheQi/p/9152384.html