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

LeetCode(python)——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 仅包含小写字母

思路

滑动窗口

方法一:

1.当s的长度小于p时,不可能存在字母异位词,直接返回[]

2.用两个数组分别记录s和p的字母数量,同时把滑动窗口的长度限制成p的长度

3.遍历s的过程中,如果两个数组相等,则记录答案

方法二(优化):

1.当s的长度小于p时,不可能存在字母异位词,直接返回[]

2.用一个数组记录字母数量,当i为p中出现的字母时,count[i] -= 1;当i为s中出现的字母时,count[i] += 1。

3.用differ记录s和p的差值(记录count中所有非0数的数量),当differ = 0 时,意味着此时窗口中的字母和p是字母异位词,记录答案

代码

方法一:

class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:s_len, p_len = len(s), len(p)ans = []if s_len < p_len:   # 处理特殊情况return anss_count = [0] * 26   # 用两个数组存s和p的字母数量p_count = [0] * 26for i in range(p_len):   # 记录p串的字母数量,顺带记录s中前len(p)的字母数量s_count[ord(s[i]) - 97] += 1p_count[ord(p[i]) - 97] += 1if s_count == p_count:ans.append(0)for i in range(s_len - p_len):   # 记录s中剩下的字母数量s_count[ord(s[i]) - 97] -= 1s_count[ord(s[i + p_len]) - 97] += 1if s_count == p_count:ans.append(i + 1)return ans

方法二:

class Solution:def findAnagrams(self, s: str, p: str) -> List[int]:s_len, p_len = len(s), len(p)ans = []if s_len < p_len:   # 处理特殊情况return anscount = [0] * 26for i in range(p_len):   # 记录len(p)的s和p串字母数量count[ord(s[i]) - 97] += 1count[ord(p[i]) - 97] -= 1differ = [c != 0 for c in count].count(True)   # 定义differ记录count中的非零数if differ == 0:ans.append(0)for i in range(s_len - p_len):   # 记录s串剩下的字母数量count[ord(s[i]) - 97] -= 1   # 滑动窗口滑动——剔除左边界if count[ord(s[i]) - 97] == 0:   # 剔除之后两种情况:1-1=0,0-1=-1(differ记录的非零数发生变化)differ -= 1elif count[ord(s[i]) - 97] == -1:differ += 1count[ord(s[i + p_len]) - 97] += 1   # 滑动窗口滑动——扩大右边界if count[ord(s[i + p_len]) - 97] == 1:   # 扩大右边界之后两种情况:0+1=1,-1+1=0(differ记录的非零数发生变化)differ += 1elif count[ord(s[i + p_len]) - 97] == 0:differ -= 1if differ == 0:ans.append(i + 1)return ans

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

相关文章:

  • 解决添加asp.net网站报错请添加 MIME 映射
  • 浙江省工程建设管理协会网站常州小程序开发公司
  • ASP vs ASP.NET vs ASP.NET Core:三代微软 Web 技术核心区别解析
  • 【项目设计】基于正倒排索引的Boost搜索引擎
  • 建网站需要几程序员关键词网站优化平台
  • 深圳网站建设方案书做sns网站需要什么
  • C语言常见推理题
  • leetcode 3542. 将所有元素变为 0 的最少操作次数 中等
  • 一文掌握,sward安装与配置
  • Supabase 开源 BaaS 平台的技术内核与实践指南
  • YOLOv5+DeepSORT目标检测
  • 通过Prometheus对GPU集群进行监控以及搭建(小型集群)
  • 【datawhale】Agentic AI学习笔记
  • 江苏国龙翔建设公司网站找工作网站建设
  • 网站建设及在线界面设计
  • Aloha浏览器 7.10.1 |私人浏览器,极速上网,资源嗅探
  • 多Agent协同-详解
  • Spring Boot 数据库操作实战:MyBatis 让 CRUD 像 “查奶茶库存” 一样简单
  • 电脑五笔打字入门口诀:3天学会五笔打字拆字
  • 自动驾驶中的B样条轨迹及B样条<->贝塞尔转换实现避障
  • 南阳市做网站网站开发是什么专业百度
  • 做外包的网站有哪些问题最好玩的网站
  • 阿尔及尔至广州直飞航线成功首航
  • 太原网站建设找山西云起时北京做网站优化的公司
  • 价值优先,敏捷致胜:超越“数据治理优先”的AI实施新范式
  • 2025年下半年软考高级系统架构师题目和答案
  • 基于多组学谱的疾病亚型分型与样本分类
  • 怎么做免费网站被收录营销推广的目标
  • java使用poi-tl模版+vform自定义表单生成word
  • MATLAB实现CNN(卷积神经网络)图像边缘识别