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

算法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" 的异位词。

 解法一:

# 解题思路:hash表、双指针、滑动窗口
class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:# 首先判断特殊情况if len(p) > len(s):return []ans=[]# 字符串字典化,方便后续对比cnt_p = defaultdict(int)for a in p:cnt_p[a]+=1p_len=len(p)# 初始化一个长度为p的窗口字典cnt_window = defaultdict(int)for b in range(p_len):cnt_window[s[b]]+=1# 如果和初始化窗口字典相同,那么其实位置就是0if cnt_p==cnt_window:ans.append(0)s_len=len(s)# 为什么从p_len开始?为什么left=right-p_len,这样[left,right]的窗口长度不就大于len(p)了吗?# 回答上面的问题,因为在对比cnt_window和cnt_p前,先执行了cnt_window[s[left]]-=1,实际起始位置是left+1for right in range(p_len,s_len):left = right-p_lencnt_window[s[right]]+=1cnt_window[s[left]]-=1# 这个是为了防止在对比时,出现value=0的情况,影响对比if cnt_window[s[left]]==0:del cnt_window[s[left]]if cnt_window==cnt_p:ans.append(left+1)return ans

解法二:

class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:ans=[]# 创建一个字符计数的字典cnt_p = Counter(p)cnt_window = Counter()for right,c in enumerate(s):left=right-len(p)+1cnt_window[c]+=1if left<0:continueif cnt_window==cnt_p:ans.append(left)cnt_window[s[left]]-=1return ans

 

 

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

相关文章:

  • 算法第31天|动态规划:最后一块石头的重量Ⅱ、目标和、一和零
  • 二分查找
  • 算法训练营day41 动态规划⑧ 121. 122.123.买卖股票的最佳时机1.2.3
  • 常用技术资料链接
  • Spring小细节
  • oelove奥壹新版v11.7旗舰版婚恋系统微信原生小程序源码上架容易遇到的几个坑,避免遗漏参数白屏显示等问题
  • Electron-updater + Electron-builder + IIS + NSIS + Blockmap 完整增量更新方案
  • 物联网后端系统架构:从基础到AI驱动的未来 - 第十章:AI促进IOT领域发生革命式发展
  • WebRTC采集模块技术详解
  • 阿里云百炼平台创建智能体-上传文档
  • Mysql使用Canal服务同步数据->ElasticSearch
  • Linux-环境变量
  • Transformer的并行计算与长序列处理瓶颈
  • 视频转二维码在教育场景中的深度应用
  • QT跨线程阻塞调用方法总结
  • SpringMVC 6+源码分析(四)DispatcherServlet实例化流程 3--(HandlerAdapter初始化)
  • 【机器学习深度学习】 知识蒸馏
  • 2.4.9-2.5.1监控项目工作-控制质量-确认范围-结束项目或阶段
  • 三极管三种基本放大电路:共射、共集、共基放大电路
  • 后量子时代已至?中国量子加密技术突破与网络安全新基建
  • 无监督学习聚类方法——K-means 聚类及应用
  • CMAQ空气质量模式实践技术及案例分析应用;CMAQ空气质量模式配置、运行
  • Go语言实战案例:使用sync.Mutex实现资源加锁
  • 一次完整的 Docker 启动失败排错之旅:从 `start-limit` 到 `network not found
  • 三坐标测量机全自研扫描测头+标配高端性能,铸就坚实技术根基
  • 如何实现一个简单的基于Spring Boot的用户权限管理系统?
  • layernorm backward CUDA优化分析
  • Spring Boot 集成 ShardingSphere 实现读写分离实践
  • MySQL数据类型介绍
  • langchain入门笔记01