算法课笔记

若一个窗口达标,缩小窗口后必达标。若一个窗口不达标,扩大窗口必不达标。这就是窗口的单调性。

如果有窗口单调性这个性质,可能用窗口或者首尾指针的方法。

蓄水池算法

假设有一个流依次输出1,2,3...,还有一个容量为10的容器。每个数字k有10/k的概率进容器,如果容器满了,容器内的数字等概率被挤出去。最后所有数字留在容器的概率相等。

KMP

检查str串中有没有match串。先对match串求next数组。next[i]表示match的字串0~i-1中最长相等前后缀。规定next[0] = -1

//求next
vector<int> get_next(string match)
{
    vector<int> next(match.size());
    next[0] = -1;
    
    for(int i = 1; i < match.size(); ++i)
    {
        int j = next[i-1];
        while(j > 0 && match[i] != match[j])
            j = next[j-1];
        
        if(match[i] == match[j])
            ++j;
       	next[i] = j;
    }
    return next;
}

//KMP
int KMP(string s, string p)
{
    vector<int> next = get_next(p);
    for(int i = 0, j = 0; i < s.size() && j < p.size();)
    {
        if(s[i] == p[j])
            ++i, ++j;
       	else if(j != 0)
            j = next[j];
        else
            ++i;
    }
    return j == p.size() ? i - j : -1;
}
posted @ 2022-05-11 20:46  hellozhangjz  阅读(24)  评论(0编辑  收藏  举报