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

【LeetCode刷题】找到字符串中所有字母异位词

给定两个字符串 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 仅包含小写字母

解题思路:

  1. 若 s 的长度小于 p 的长度,直接返回空列表(不可能存在异位词)。
  2. 分别统计 p 的字符频率和 s 中长度为 len(p) 的初始窗口的字符频率。
  3. 滑动窗口遍历 s:每次窗口右移一位,更新窗口的字符频率,并比较当前窗口与 p 的字符频率是否一致。若一致,则记录当前窗口的起始索引。

Python代码:

from typing import List
import reclass Solution:def findAnagrams(self, s: str, p: str) -> List[int]:n, m = len(s), len(p)if n < m:return []cnt_p = [0] * 26cnt_s = [0] * 26for i in range(m):cnt_p[ord(p[i]) - ord('a')] += 1cnt_s[ord(s[i]) - ord('a')] += 1res = []if cnt_p == cnt_s:res.append(0)for i in range(1, n - m + 1):cnt_s[ord(s[i - 1]) - ord('a')] -= 1cnt_s[ord(s[i + m - 1]) - ord('a')] += 1if cnt_p == cnt_s:res.append(i)return resif __name__ == "__main__":# 处理输入(格式如:s = "cbaebabacd",p = "abc")s_input = input().strip()p_input = input().strip()# 提取字符串内容s = re.search(r'"(.*?)"', s_input).group(1)p = re.search(r'"(.*?)"', p_input).group(1)solution = Solution()result = solution.findAnagrams(s, p)print(result)

LeetCode提交代码:

class Solution:from typing import Listdef findAnagrams(self, s: str, p: str) -> List[int]:n, m = len(s), len(p)if n < m:return []# 初始化字符频率数组(仅小写字母,长度为26)cnt_p = [0] * 26cnt_s = [0] * 26# 统计p的字符频率和s的初始窗口(前m个字符)的频率for i in range(m):cnt_p[ord(p[i]) - ord('a')] += 1cnt_s[ord(s[i]) - ord('a')] += 1res = []# 检查初始窗口是否为异位词if cnt_p == cnt_s:res.append(0)# 滑动窗口遍历剩余部分for i in range(1, n - m + 1):# 移除窗口左侧的字符cnt_s[ord(s[i-1]) - ord('a')] -= 1# 加入窗口右侧的新字符cnt_s[ord(s[i + m - 1]) - ord('a')] += 1# 检查当前窗口是否为异位词if cnt_p == cnt_s:res.append(i)return res

程序运行结果如下:

总结

本文介绍了在字符串s中查找所有p的异位词子串的算法。异位词指字母相同但顺序不同的字符串。算法采用滑动窗口法,通过维护两个字符频率数组(分别对应p和s的当前窗口)进行比较。具体步骤包括:1)检查s长度不小于p;2)初始化字符频率数组;3)滑动窗口遍历s,更新窗口频率并比较。时间复杂度为O(n),空间复杂度为O(1)。示例输入如s="cbaebabacd",p="abc"时输出[0,6],验证了算法的正确性。该解法适用于处理小写字母组成的字符串匹配问题。

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

相关文章:

  • 榆林城乡建设规划官方网站中国室内设计师
  • oneinstack wordpress成都官网seo服务
  • Go语言编译 | 探讨Go语言编译原理与优化技巧
  • 【深入理解】动静态库的制作、使用与加载原理(附详细操作指南)
  • OpenFeign:完整学习笔记
  • Vue 3 的Suspense组件:讲解如何使用_Suspense_处理异步组件加载状态
  • 【go.sixue.work】2.2 面向对象:接口与多态
  • 建设网站需要收费吗做淘客找单子的网站
  • 视频号直播视频录制
  • 抓取资源的网站怎么做珠海网站设计培训班
  • CPO(Co-Packaged Optics) 是整个数据中心互连范式的下一代核心
  • 1.5 ShaderFeature
  • 暄桐教练日课·10天《梦瑛篆书千字文》报名啦~
  • 从代码规范到 AI Agent:现代前端开发的智能化演进
  • 【MySQL】01 数据库入门
  • dede网站地图栏目如何上传文件wordpress禁用古登堡
  • 【ZeroRange WebRTC】RTP/RTCP/RTSP协议深度分析
  • 有商家免费建商城的网站吗网站上面关于我们要怎么填写
  • MySQL WHERE 子句
  • 力扣每日一题:统计1的显著的字符串数目
  • 彩票网站搭建多钱百度上做网站模板
  • PAM4技术:系统深入解析与应用实践
  • 无线资源映射RE Mapping介绍
  • ​​Vue 拦截器教程​
  • 科普:.NET应用开发的环境搭建
  • cn域名后缀网站南通网站建设南通
  • Kafka集群架构(ZK + Kafka)
  • 编程语言哪种编译器好 | 如何选择适合自己的编译器,提高开发效率
  • 【原创】基于YOLO模型的手势识别系统
  • 11.15 脚本网页 剪切板管家