算法课笔记
若一个窗口达标,缩小窗口后必达标。若一个窗口不达标,扩大窗口必不达标。这就是窗口的单调性。
如果有窗口单调性这个性质,可能用窗口或者首尾指针的方法。
蓄水池算法
假设有一个流依次输出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;
}