当前位置: 首页 > 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.lryc.cn/news/623845.html

相关文章:

  • 凸函数与损失函数
  • 开源数据发现平台:Amundsen Search Service 搜索服务
  • Python注解
  • 零墨云A4mini打印机设置电脑通过局域网络进行打印
  • C#对象的本地保存与序列化详解笔记
  • GitLab CI/CD、Jenkins与GitHub Actions在Kubernetes环境中的方案对比分析
  • 【Golang】:错误处理
  • 任务型Agent架构简介
  • Visual Studio Code 基础设置指南
  • 【R语言】R 语言中打印含有双引号的字符串时会出现 “\” 的原因解析
  • GaussDB常用术语缩写及释义
  • 路由器配置之模式
  • 4.Ansible自动化之-部署文件到主机
  • nodejs 中间件
  • gitee 流水线+docker-compose部署 nodejs服务+mysql+redis
  • 【计算机网络面试】TCP/IP网络模型有哪几层
  • Matlab数字信号处理——基于最小均方误差(MMSE)估计的自适应脉冲压缩算法复现
  • ThinkPHP8学习篇(三):控制器
  • 7.Ansible自动化之-实施任务控制
  • 最优化:建模、算法与理论|02 Optimization Modeling and Typical Examples(1)
  • [优选算法专题二滑动窗口——将x减到0的最小操作数]
  • 【adb端口5555】烽火hg680-gy_烽火hg680-gc安卓9线刷烧录包 解决用一段时间就提示升级的问题
  • Shell脚本-for循环语法结构
  • 【前端基础】19、CSS的flex布局
  • 蓝凌EKP产品:JSP 性能优化和 JSTL/EL要点检查列表
  • rt-thread audio框架移植stm32 adc+dac,用wavplayer录音和播放
  • 【从零开始学习Redis】项目实战-黑马点评D2
  • scikit-learn/sklearn学习|多任务套索回归MultiTaskLasso解读
  • Windows_Server软件定义网络架构
  • 【Linux系列】如何在 Linux 服务器上快速获取公网