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

【每日一题】Day 6

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 * 104
s 和 p 仅包含小写字母


思路:

统计目标字符串 p 的字符频率
在 s 上用一个固定长度为 len(p)滑动窗口,维护窗口内的字符频率。
每次窗口右移加入一个新字符,移除一个旧字符
比较窗口频率和 p 的频率,如果相同,就记录当前窗口起始位置
滑动到结尾,返回所有起始索引。


代码实现(Go):

详细注解:

//package main
//
//import "fmt"func findAnagrams(s string, p string) []int {res := []int{} // 用于存放结果的切片if len(s) < len(p) {return res // 如果s比p短,不可能有异位词,直接返回空数组}// 定义两个长度为26的数组,用于存储字符频率// 下标 0~25 对应 'a'~'z'// pCount:模板的字母频率// winCount:当前窗口里的字母频率var pCount, winCount [26]int// 初始化当前窗口并统计 p 的字符频率for i := 0; i < len(p); i++ {pCount[p[i]-'a']++   // 统计 p 中每个字母出现次数winCount[s[i]-'a']++ // 当前窗口的字母计数,初始化为s的前len(p)个字符的频率}// 检查第一个窗口是否和 p 的字母计数相等// 如果相等,则第一个窗口就是一个异位词if winCount == pCount {res = append(res, 0) // 初始窗口起始索引为0}// 从第 len(p) 个字符开始,向右滑动窗口遍历 s 的剩余部分// i 是当前窗口右边新加进来的字符的下标for i := len(p); i < len(s); i++ {winCount[s[i]-'a']++        // 加入新字符到窗口并计数winCount[s[i-len(p)]-'a']-- // 移除窗口最左边的旧字符// 判断当前窗口计数是否和 p 相等// 如果相等,说明找到了一个异位词,记录起始索引if winCount == pCount {res = append(res, i-len(p)+1)}}return res
}//func main() {
//	s, p := "cbaebabacd", "abc"
//	fmt.Println(findAnagrams(s, p)) // 输出: [0,6]
//}

无注释:

//package main
//
//import "fmt"func findAnagrams(s string, p string) []int {res := []int{}if len(s) < len(p) {return res}var pCount, winCount [26]intfor i := 0; i < len(p); i++ {winCount[s[i]-'a']++pCount[p[i]-'a']++}if winCount == pCount {res = append(res, 0)}for i := len(p); i < len(s); i++ {winCount[s[i]-'a']++winCount[s[i-len(p)]-'a']--if winCount == pCount {res = append(res, i-len(p)+1)}}return res
}//func main() {
//	s, p := "cbaebabacd", "abc"
//	fmt.Println(findAnagrams(s, p)) // 输出: [0,6]
//}

http://www.dtcms.com/a/336748.html

相关文章:

  • 《算法导论》第 26 章 - 最大流
  • 华为云之Linux系统安装部署Tomcat服务器
  • 【C#补全计划】协变逆变
  • C++入门自学Day11-- String, Vector, List 复习
  • Linux 下基于 TCP 的 C 语言客户端/服务器通信详解(三个示例逐步进阶)
  • 高级堆结构
  • STM32学习笔记13-通信协议I2CMPU6050
  • Vue深入组件:Props 详解1
  • 文本邮箱提取工具
  • ARM汇编代码新手入门
  • 信号量机制中---生产者 - 消费者问题
  • LeetCode 1323: 6和9组成的最大数字
  • 计算机网络技术学习-day2《IP地址分类解析》
  • 中国星网发展情况全面分析
  • 每日Java面试系列(15):进阶篇(String不可变的原因、性能问题、String三剑客、自定义不可变设计、组合优于继承等相关问题)
  • 数据结构——线性表
  • 蓝桥杯C++
  • 下降路径最小和
  • 《Java高并发核心编程》笔记汇总
  • 【Java企业级开发】(八)Spring框架中Web项目构建
  • 【高等数学】第九章 多元函数微分法及其应用——第六节 多元函数微分学的几何应用
  • Transformer架构的数学本质:从注意力机制到大模型时代的技术内核
  • AI 编程在老项目中的困境与改进方向
  • 负载测试与压力测试详解
  • MySQL黑盒子研究工具 strace
  • 基于因果性的深层语义知识图谱对文本预处理的积极影响
  • Perf使用详解
  • AI系统性思维复盘概述
  • 【FreeRTOS】事件组
  • 电力设备状态监测与健康管理:从数据感知到智能决策的技术实践​