当前位置: 首页 > news >正文

[LeetCode 438/567] 找到字符串中所有字母异位词/字符串的排列(滑动窗口)

【LeetCode 438】找到字符串中所有字母异位词

题面:

在这里插入图片描述

思路:

哈希表+滑动窗口:也可用于 567
哈希表记录滑动窗口内字符个数,easy不详细赘述,俺代码可以继续优化,这里用了两个哈希表去做对比,可以优化成一个哈希表上的加减,当 h a s h [ c ] = = 0 hash[c]==0 hash[c]==0 时,说明当前字符 c c c 在字符串 p p p 和滑动窗口内出现的次数相同。

代码:

vector<int> findAnagrams(string s, string p) {int n= (int)p.size();vector<int> hashP(26);vector<int> hash(26);vector<int> res;for(const auto& c : p) ++ hashP[c - 'a'];for(int i = 0, j = 0; j < (int)s.size(); ++j) {while(j - i + 1 > n) --hash[s[i++] - 'a'];hash[s[j] - 'a'] ++;if(j - i + 1 == n) {bool flag = true;for(size_t k = 0; k < 26; ++ k)if(hash[k] != hashP[k]) {flag = false;break;}if(flag) res.push_back(i);}}return res;
}

【LeetCode 567】字符串的排列

题面:

在这里插入图片描述

思路:

统计相同字符+滑动窗口:也可用于 438,微调一下就行

umm看了一下和官方题解差不多,就直接copy它的思路和代码了。

c n t 1 cnt1 cnt1 数组统计字符串 s 1 s1 s1 中各个字符的个数, c n t 2 cnt2 cnt2 数组统计当前字串(滑动窗口内)各个字符的个数。
用变量 d i f f diff diff 统计 c n t 1 cnt1 cnt1 c n t 2 cnt2 cnt2 内不同值的个数。若 d i f f = = 0 diff==0 diff==0 则说明 c n t 1 = = c n t 2 cnt1 == cnt2 cnt1==cnt2,合法;否则说明 c n t 1 ≠ c n t 2 cnt1 \ne cnt2 cnt1=cnt2,当前字串不是 s 1 s1 s1 的排列。

每次滑动窗口一进一出两个字符 x x x y y y
x = y x=y x=y,则 c n t 2 cnt2 cnt2 无变化;
x ≠ y x\ne y x=y,对于字符 x x x,若加入 x x x 之前 c n t 1 [ x ] = c n t 2 [ x ] cnt1[x]=cnt2[x] cnt1[x]=cnt2[x],则说明加入 x x x 之后失衡 d i f f + 1 diff+1 diff+1;若加入 x x x 之后 c n t 1 [ x ] = c n t 2 [ x ] cnt1[x]=cnt2[x] cnt1[x]=cnt2[x],说明加入 x x x 之后 x x x 在字串和 s 1 s1 s1出现的次数相同 d i f f − 1 diff-1 diff1
注意: 可用 c n t [ x ] = c n t 2 [ x ] − c n t 1 [ x ] cnt[x] = cnt2[x] - cnt1[x] cnt[x]=cnt2[x]cnt1[x] 以简化上述流程,将 c n t 1 [ x ] cnt1[x] cnt1[x] c n t 2 [ x ] cnt2[x] cnt2[x] 的比较替换成 c n t [ x ] cnt[x] cnt[x] 0 0 0 的比较。

代码:

bool checkInclusion(string s1, string s2) {int n = (int)s1.size(), m = (int)s2.size();if(n > m) return false;vector<int> cnt(26);int diff = 0;for(int i = 0; i < n; ++i) {-- cnt[s1[i] - 'a'];++ cnt[s2[i] - 'a'];}for(int c : cnt)if(c) ++ diff;if(!diff) return true;for(int i = n; i < m; ++i) {int x = s2[i] - 'a', y = s2[i - n] - 'a';if(x == y) continue;if(!cnt[x]) ++ diff;if(++ cnt[x] == 0) --diff;if(!cnt[y]) ++ diff;if(-- cnt[y] == 0) --diff;if(!diff) return true;}return false;
}

俺原本的代码:

bool checkInclusion(string s1, string s2) {if(s1.size() > s2.size()) return false;int n = (int)s1.size();unordered_map<int, int> mp;for(const auto& c : s1) ++ mp[c - 'a'];for(int i = 0, j = 0; j < (int)s2.size(); ++j) {while(j - i + 1 > n) {if(mp.find(s2[i] - 'a') != mp.end())mp[s2[i] - 'a'] ++;++i;}// 滑动窗口(字串)只统计在 s1 出现过的字符// 若当前字符 s2[j] 没在 s1 出现过,则继续遍历(因为加入 s2[j] 对结果无贡献)if(mp.find(s2[j] - 'a') != mp.end()) mp[s2[j] - 'a'] --;else continue;if(j - i + 1 == n) {bool flag = true;for(const auto& it : mp)if(it.second != 0) {flag = false;break;}if(flag) return true;}}return false;
}
http://www.xdnf.cn/news/190531.html

相关文章:

  • tsconfig.json的配置项介绍
  • 云原生周刊:Kubernetes v1.33 正式发布
  • 用JavaScript构建3D程序
  • 2025系统架构师---论微服务架构及其应用
  • Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
  • 老电脑优化全知道(包括软件和硬件优化)
  • 【爬虫】一文掌握 adb 的各种指令(adb备忘清单)
  • 【Mybatis】Mybatis基础
  • 集合框架篇-java集合家族汇总
  • 【3D基础】深入解析OBJ与MTL文件格式:Blender导出模型示例及3D开发应用
  • 【KWDB 创作者计划】_企业数据管理的利刃:技术剖析与应用实践
  • CMake:设置编译C++的版本
  • 【北京】昌平区某附小v3700存储双控故障维修案例
  • 分布式链路追踪理论
  • 【Axure视频教程】手电筒效果
  • 【题解-Acwing】867. 分解质因数
  • 【蒸馏(5)】DistillBEV代码分析
  • FPGA-DDS信号发生器
  • 3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目
  • 数据可视化
  • 【C++教程】三目运算符
  • Day8 鼠标控制与32位模式切换
  • AIGC重构元宇宙:从内容生成到沉浸式体验的技术革命
  • 临床试验概述:从定义到实践的关键要素
  • R 语言科研绘图第 43 期 --- 桑基图-冲击
  • 软件设计师速通其一:计算机内部数据表示
  • 数据库学习笔记(十三)---存储过程
  • OpenCV 图形API(68)图像与通道拼接函数------垂直拼接两个图像/矩阵的函数concatVert()
  • 手搓传染病模型(SEIR-拓展)
  • 深度对比:Objective-C与Swift的RunTime机制与底层原理