438 刷题和总结

想了一下,想要考初试第一,太 tm 难了。我还是老老实实目标 360 好了。不要给自己那么大的压力,细水长流慢慢来就完事了。

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> count_s(26, 0);
        vector<int> count_p(26, 0);
        for ( auto& ch: p ) {
            count_p[ch - 'a']++;
        }
        vector<int> ans;
        int len_s = s.size();
        int len_p = p.size();
        if ( len_p > len_s ) {
            return ans;
        }
        for ( int i = 0; i < len_p; i++ ) {
            count_s[ s[i] - 'a' ]++;
        }
        if ( count_p == count_s ) {
            ans.push_back( 0 );
        }
        for ( int i = len_p; i < len_s; i++ ) {
            count_s[ s[i] - 'a' ]++;
            count_s[ s[ i - len_p ] - 'a' ]--;
            if ( count_p == count_s ) {
                ans.push_back( i - len_p + 1 );
            }
        }
        return ans;
    }
};

需要调一下边界情况就好了。本质上是看,一个固定的滑动窗口内部,里面出现的字母的频次,是否完全相等,然后的话,如果我们把窗口滑动,窗口的左边,一定是要移出的,也就是对应代码里面的频次减少 1.

移出的下标是 i - len_p ,窗口的左边是 i - len_p + 1

相关推荐
习惯就好zz3 天前
让 Neovim 的 clang-tidy 诊断和命令行完全一致
cpp·clangd·nvim·clang-tidy·lazyvim·nvim-lint
atsec4 天前
PCI取证调查 – 高效应对支付产业潜在的数据泄露
cpp·atsec·pci·数据泄露·pfi
bu_shuo19 天前
计算机二级基础知识-数据结构学习
cpp·计算机二级
itgather1 个月前
星号密码查看器 — 功能介绍
cpp·星号密码·hwnd
程序大视界2 个月前
【C++ 从基础到项目实战】C++(六):拷贝控制——浅拷贝与深拷贝,兼谈智能指针
开发语言·c++·cpp
程序大视界2 个月前
【C++ 从基础到项目实战】C++(二):数组、字符串与结构体——组织数据的容器
开发语言·c++·cpp
程序大视界2 个月前
【C++ 从基础到项目实战】C++(五):类与对象基础——构造、析构与访问控制
开发语言·c++·cpp
程序大视界2 个月前
【C++ 从基础到项目实战】C++(八):运算符重载——让你的类用起来像内置类型
开发语言·c++·cpp
程序大视界2 个月前
【C++ 从基础到项目实战】C++(三):函数进阶——重载、回调、递归与默认参数
开发语言·c++·cpp
程序大视界2 个月前
【C++ 从基础到项目实战】C++(九):友元与设计模式初探——打破封装的艺术
开发语言·c++·cpp