Python算法题集_找到字符串中所有字母异位词

本文为Python算法题集之一的代码示例

题目438:找到字符串中所有字母异位词

说明:给定两个字符串 sp,找到 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

  • sp 仅包含小写字母


问题分析

  1. 因p是固定的,所以检查是否为p的异位词可以直接使用数组的字符计数比较即可【p仅含小写字母,因此数组只有26个元素】
  2. 因p长度固定,因此单循环即可遍历字符串
  3. 优化思路
    1. 减少计算
    2. 加快比较

  1. 标准版【循环进行异位词比较】,性能良好,超越89%,标准版的性能就比较高,说明本题可以优化的空间不大

    注意:CheckFuncPerf是我手搓的函数用时和内存占用模块,下载地址在这里:测量函数运行用时、内存占用的代码单元CheckFuncPerf.py以及使用方法
    在这里插入图片描述

    import CheckFuncPerf as cfpdef findAnagrams(s: str, p: str) -> list[int]:list_p = [0] * 26list_s = [0] * 26list_result = []for iIdx in range(len(p)):list_p[ord(p[iIdx])-ord('a')] += 1for iIdx in range(len(s)):list_s[ord(s[iIdx])-ord('a')] += 1if iIdx < len(p) - 1:continueif list_s == list_p:list_result.append(iIdx - len(p) + 1)list_s[ord(s[iIdx-len(p)+1]) - ord('a')] -= 1return list_results, p = 'cbaebabacd', 'abc'
    result = cfp.getTimeMemoryStr(findAnagrams, s, p)
    print(result['msg'],'执行结果={}'.format(result['result']))
    # 运行结果
    函数 findAnagrams 的运行时间为 0.00 ms;内存使用量为 4.00 KB 执行结果=[0, 6]
    
  2. 优化版【每次判断是否出现未出现在p中的字符,如出现进行跳跃】,性能自由落体,超越42%
    在这里插入图片描述

    这种优化有赖于p的特性,p的长度越长,优化效果越好;反之,因为每个字符都要多一次比较,性能反而会下降

    def findAnagrams_ext1(s: str, p: str) -> list[int]:list_p = [0] * 26list_s = [0] * 26list_result = []for iIdx in range(len(p)):list_p[ord(p[iIdx])-ord('a')] += 1iIdx, ileft = 0, 0while iIdx < len(s):if p.find(s[iIdx])<0:if iIdx<len(p):for jIdx in range(iIdx):list_s[ord(s[jIdx])-ord('a')] = 0else:for jIdx in range(len(p)):list_s[ord(s[iIdx-jIdx])-ord('a')] = 0iIdx += 1ileft = iIdxcontinuelist_s[ord(s[iIdx])-ord('a')] += 1if iIdx < len(p) + ileft - 1:iIdx += 1continueif list_s == list_p:list_result.append(iIdx - len(p) + 1)list_s[ord(s[iIdx-len(p)+1]) - ord('a')] -= 1ileft += 1iIdx += 1return list_results, p = 'cbaebabacd', 'abc'
    result = cfp.getTimeMemoryStr(findAnagrams_ext1, s, p)
    print(result['msg'],'执行结果={}'.format(result['result']))
    # 运行结果
    函数 findAnagrams_ext1 的运行时间为 0.00 ms;内存使用量为 0.00 KB 执行结果=[0, 6]
    
  3. 计算优化版【标准版中,将ord('a')先计算出来,避免每次计算】,性能优异,超越97%
    在这里插入图片描述

    def findAnagrams_iorda(s: str, p: str) -> list[int]:iOrda = ord('a')list_p = [0] * 26list_s = [0] * 26list_result = []for iIdx in range(len(p)):list_p[ord(p[iIdx])-iOrda] += 1for iIdx in range(len(s)):list_s[ord(s[iIdx])-iOrda] += 1if iIdx < len(p) - 1:continueif list_s == list_p:list_result.append(iIdx - len(p) + 1)list_s[ord(s[iIdx-len(p)+1]) - iOrda] -= 1return list_results, p = 'cbaebabacd', 'abc'
    result = cfp.getTimeMemoryStr(findAnagrams_iorda, s, p)
    print(result['msg'],'执行结果={}'.format(result['result']))
    # 运行结果
    函数 findAnagrams_iorda 的运行时间为 0.00 ms;内存使用量为 0.00 KB 执行结果=[0, 6]
    
  4. 优化加强版【优化版中,将ord('a')先计算出来,避免每次计算】,性能一般,超越54%
    在这里插入图片描述

    def findAnagrams_ext1_iorda(s: str, p: str) -> list[int]:iOrda = ord('a')list_p = [0] * 26list_s = [0] * 26list_result = []for iIdx in range(len(p)):list_p[ord(p[iIdx])-iOrda] += 1iIdx, ileft = 0, 0while iIdx < len(s):if p.find(s[iIdx])<0:if iIdx<len(p):for jIdx in range(iIdx):list_s[ord(s[jIdx])-iOrda] = 0else:for jIdx in range(len(p)):list_s[ord(s[iIdx-jIdx])-iOrda] = 0iIdx += 1ileft = iIdxcontinuelist_s[ord(s[iIdx])-iOrda] += 1if iIdx < len(p) + ileft - 1:iIdx += 1continueif list_s == list_p:list_result.append(iIdx - len(p) + 1)list_s[ord(s[iIdx-len(p)+1]) - iOrda] -= 1ileft += 1iIdx += 1return list_results, p = 'cbaebabacd', 'abc'
    result = cfp.getTimeMemoryStr(findAnagrams_ext1_iorda, s, p)
    print(result['msg'],'执行结果={}'.format(result['result']))
    # 运行结果
    函数 findAnagrams_ext1_iorda 的运行时间为 0.00 ms;内存使用量为 0.00 KB 执行结果=[0, 6]
    

    一日练,一日功,一日不练十日空

    may the odds be ever in your favor ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/437874.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 外观模式(实例详解)

文章目录 示例1&#xff1a;初始化游戏场景中的多个子系统示例2&#xff1a;管理音频播放示例3&#xff1a;场景加载流程示例4&#xff1a;UI管理器示例5&#xff1a;网络服务通信 在Unity中使用外观模式&#xff08;Facade&#xff09;时&#xff0c;主要目的是为了简化复杂子…

MySQL数据查询语言DQL

MySQL数据查询语言DQL 目录 MySQL数据查询语言DQLDQL关键字数据查询语言DQL1.查询表2.子查询3.联表查询4.GROUP BY5.HAVING6.分页查询7.排序查询 DQL关键字 DQL关键字含义SELECTSELECT 字段列表&#xff0c;查询检索的列或表达式&#xff0c;它指定了最终结果包含的列FROMFROM…

vue —— h函数的学习与使用

文章目录 一、h函数是什么&#xff1f;二、h函数格式说明及使用示例1&#xff1a;简单创建一个VNode&#xff08;vue3&#xff09;示例2&#xff1a;vue2中h函数用法示例3&#xff1a;vue3中h函数的用法vue2和vue3中h函数的区别&#xff1f; 三、h函数实现原理四、h函数常用场景…

《动手学深度学习(PyTorch版)》笔记3.1

Chapter3 Linear Neural Networks 3.1 Linear Regression 3.1.1 Basic Concepts 我们通常使用 n n n来表示数据集中的样本数。对索引为 i i i的样本&#xff0c;其输入表示为 x ( i ) [ x 1 ( i ) , x 2 ( i ) , . . . , x n ( i ) ] ⊤ \mathbf{x}^{(i)} [x_1^{(i)}, x_2…

opencv学习笔记

学习OpenCV3 文章目录 学习OpenCV3openCV模块介绍 图片处理滤波/卷积核高斯滤波 算子索贝尔(sobel)算子沙尔(Scharr)算子拉普拉斯算子Canny边缘检测 **实际使用** 形态学获取形态学卷积核全局二值化自适应阈值二值化腐蚀操作膨胀操作开运算、闭运算形态学梯度顶帽操作黑帽操作 …

Redis 学习笔记 2:Java 客户端

Redis 学习笔记 2&#xff1a;Java 客户端 常见的 Redis Java 客户端有三种&#xff1a; Jedis&#xff0c;优点是API 风格与 Redis 命令命名保持一致&#xff0c;容易上手&#xff0c;缺点是连接实例是线程不安全的&#xff0c;多线程场景需要用线程池来管理连接。Redisson&…

Flink的SQL开发

概叙 Flink有关FlinkSQL的官网: https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/table/sql/overview/ 阿里云有关FlinkSQL的官网: https://help.aliyun.com/zh/flink/developer-reference/overview-5?spma2c4g.11186623.0.0.3f55bbc6H3LVyo Ta…

谷歌seo内容营销怎么做?

谷歌SEO内容营销就像是在为两个观众准备一场表演&#xff0c;一边是用户&#xff0c;一边则是谷歌搜索引擎&#xff0c;那么所谓的内容营销&#xff0c;你自然需要知道你的观众想看什么&#xff0c;这就是关键词研究&#xff0c;帮你了解用户在搜索什么&#xff0c;然后&#x…

表单常用正则表达式(手机,邮箱,身份证,数字,空格...)

#表单常用正式表达式 为了后面项目的拿来即用以便不时之需&#xff0c;特意整理一文&#xff0c;把常用的表单验证的正则表达式整理如下。 不能为空 pattern: /^[^\s]$/ 验证手机号 pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

阿里云购买云服务部署小记

1.先购买云服务器 阿里云网址 阿里云云服务器购买 我这是前端时间出活动买的 点击购买 注: 3M的带宽&#xff0c;可以支持同一秒访问30-35个人不卡(其他依次类似类推) 购买前配置的话 选的也没那么多 一般开发人员根据自己喜好顺手的来 跟我一样是刚接触小白的话 听客服…

微搭低代码从入门到精通01应用介绍

目录 1 学习路线图2 应用介绍3 编辑器介绍总结 低代码的概念于2014年由 Forrester 首次正式提出。其将低代码定义为&#xff1a;能够以“最少的手写代码”和设置快速开发应用、配置和部署业务应用程序。 不同应用厂商的解法不一样&#xff0c;Gartner评估了400多款低代码/无代码…