week19

+ 本周只有四道题(?

187 - 重复的DNA序列

感觉这个题 也不是KMP.. 主要是子串要枚举很多次 字符串哈希吧应该是

复习一下KMP tmd 写一次忘一次(暴躁)

int n = s.size(), m = p.size();
s = ' ' + s, p = ' ' + p;
vector<int> ne(m + 2);
// 1. 统计ne
for(int i = 2, j = 0; i <= m; i++)
{
    while(j && p[i] != p[j + 1]) j = ne[j];
    if(p[i] == p[j + 1]) j++;
    ne[i] = j;
}
// 2. KMP匹配
for(int i = 1, j = 0; i <= n; i++)
{
    while(j && s[i] != s[j + 1]) j = ne[j];
    if(s[i] == p[j + 1]) j++;
    if(j == m)
    {
        // 匹配成功的逻辑
    }
}

这题应该就是字符串哈希了, 这里除了常规的字符串哈希逻辑之外, 找到出现过的就清空 这里就直接改count就好了

188 - 买卖股票的最佳时期IV

是的 这题就是状态机模型 股票终极版

首先,提前判断-> 如果k足够大, 就相当于 可以无限买卖 这样的话实际就是之前做过的122题 当时那个把整段交易拆分成每天交易一次的思想

除了这个之外, 状态机模型:

avatar

189 - 旋转数组

要求使用空间复杂度为 O(1) 的 原地 算法

  1. 将整个数组翻转一遍

[1,2,3,4,5,6,7] -> [7,6,5,4,3,2,1]

  1. 将前k个数翻转 后k个数翻转

-> [5,6,7, | 1,2,3,4]

翻转可以采用双指针算法,空间复杂度是o(1)

190 - 颠倒二进制位

从右到左扣出每一位 反过来补给res上

Last updated