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

【滑动窗口】找到字符串中所有字⺟异位词(medium)

6. 找到字符串中所有字⺟异位词(medium)

  • 题⽬描述:
  • 解法(滑动窗⼝ + 哈希表):
    • 算法思路:
  • C++ 算法代码:
  • Java 算法代码:
  • 注:

题⽬链接:438. 找到字符串中所有字⺟异位词

题⽬描述:

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的⼦串,返回这些⼦串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字⺟重排列形成的字符串(包括相同的字符串)。
⽰例 1:
输⼊:
s = “cbaebabacd”, p = “abc”
输出:
[0,6]
解释:
起始索引等于 0 的⼦串是 “cba”, 它是 “abc” 的异位词。
起始索引等于 6 的⼦串是 “bac”, 它是 “abc” 的异位词。
⽰例 2:
输⼊:
s = “abab”, p = “ab”
输出:
[0,1,2]
解释:
起始索引等于 0 的⼦串是 “ab”, 它是 “ab” 的异位词。
起始索引等于 1 的⼦串是 “ba”, 它是 “ab” 的异位词。
起始索引等于 2 的⼦串是 “ab”, 它是 “ab” 的异位词。
提⽰:
1 <= s.length, p.length <= 3 * 10^4
s 和 p 仅包含⼩写字⺟

解法(滑动窗⼝ + 哈希表):

算法思路:

◦ 因为字符串 p 的异位词的⻓度⼀定与字符串 p 的⻓度相同,所以我们可以在字符串 s 中构
造⼀个⻓度为与字符串 p 的⻓度相同的滑动窗⼝,并在滑动中维护窗⼝中每种字⺟的数量;
◦ 当窗⼝中每种字⺟的数量与字符串 p 中每种字⺟的数量相同时,则说明当前窗⼝为字符串 p
的异位词;
◦ 因此可以⽤两个⼤⼩为 26 的数组来模拟哈希表,⼀个来保存 s 中的⼦串每个字符出现的个
数,另⼀个来保存 p 中每⼀个字符出现的个数。这样就能判断两个串是否是异位词。

C++ 算法代码:

class Solution{
public:vector<int> findAnagrams(string s, string p){vector<int> ret;int hash1[26] = { 0 }; // 统计字符串 p 中每个字符出现的个数for(auto ch : p) hash1[ch - 'a']++;int hash2[26] = { 0 }; // 统计窗⼝⾥⾯的每⼀个字符出现的个数int m = p.size();for(int left = 0, right = 0, count = 0; right < s.size(); right++){char in = s[right];// 进窗⼝ + 维护 countif(++hash2[in - 'a'] <= hash1[in - 'a']) count++; if(right - left + 1 > m){ // 判断char out = s[left++];// 出窗⼝ + 维护 countif(hash2[out - 'a']-- <= hash1[out - 'a']) count--; }// 更新结果if(count == m) ret.push_back(left);}return ret;}
}

Java 算法代码:

class Solution{public List<Integer> findAnagrams(String ss, String pp){List<Integer> ret = new ArrayList<Integer>();char[] s = ss.toCharArray();char[] p = pp.toCharArray();int[] hash1 = new int[26]; // 统计字符串 p 中每⼀个字符出现的个数for(char ch : p) hash1[ch - 'a']++;int[] hash2 = new int[26]; // 统计窗⼝中每⼀个字符出现的个数int m = p.length;for(int left = 0, right = 0, count = 0; right < s.length; right++){char in = s[right];// 进窗⼝ + 维护 countif(++hash2[in - 'a'] <= hash1[in - 'a']) count++; if(right - left + 1 > m){ // 判断char out = s[left++];// 出窗⼝ + 维护 countif(hash2[out - 'a']-- <= hash1[out - 'a']) count--; }// 更新结果if(count == m) ret.add(left);}return ret;}
}

注:

if(right-left+1>m){if(hash2[ss[left++]-'a']--<=hash1[ss[left++]-'a']){count--;} 
}

是错的
在这里插入图片描述
可改为·

if(right-left+1>m){char leftChar = ss[left++];if(hash2[leftChar-'a']--<=hash1[leftChar-'a']){count--;} 
}

if(right-left+1>m){if (hash2[ss[left] - 'a']-- <= hash1[ss[left] - 'a']) count--;left++;
}
http://www.xdnf.cn/news/614.html

相关文章:

  • 计算机组成原理笔记(十六)——4.1基本算术运算的实现
  • 8、constexpr if、inline、类模版参数推导、lambda的this捕获---c++17
  • 【滑动窗口】串联所有单词的⼦串(hard)
  • 常用的几种 Vue 父子组件传值方式
  • redis+lua脚本
  • 【英语语法】词法---动词
  • hadoop分布式部署
  • Linux `init 5` 相关命令的完整使用指南
  • Android学习总结之APK打包流程
  • 【踩坑记录】Pico串流SteamVR绿屏解决方案:排查兼容性问题与Windows系统升级指南
  • STM32 HAL库FreeRTOS 中断管理
  • XSS学习1之http回顾
  • 【读书笔记·VLSI电路设计方法解密】问题63:为什么可测试性设计对产品的财务成功至关重要
  • 机器学习周报-文献阅读
  • FastAPI-MCP
  • 8节串联锂离子电池组可重构buck-boost均衡拓扑结构 simulink模型仿真
  • 个人所得税
  • DeepSeek R1 7b,Langchain 实现 RAG 知识库 | LLMs
  • 抽象工厂模式及其在自动驾驶中的应用举例(c++代码实现)
  • 秒杀抢购系统架构与优化全解:从业务特性到技术落地
  • tigase源码学习杂记-组件化设计
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月20日第58弹
  • 智能体团队 (Agent Team)
  • 考研系列-计算机网络-第三章、数据链路层
  • Linux:网络基础
  • 深入理解 Transformer:原理、架构与注意力机制全景图解
  • 微信怎么绑定孩子的医保卡
  • w299基于Java的家政服务平台设计与实现
  • idea中运行groovy程序报错
  • FISCO 2.0 安装部署WeBASE与区块链浏览器(环境搭建)