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

《Python数据结构与算法分析》第二弹《2.2.2 异序词检测示例》

2.2.2 异序词检测示例

要展示不同数量级的算法,一个好例子就是经典的异序词检测问题。如果一个字符串只是重排了另一个字符串的字符,那么这个字符串就是另一个的异序词,比如heart与earth,以及python与typhon。为了简化问题,假设要检查的两个字符串长度相同,并且都是由26个英文字母的小写形式组成的。我们的目标是编写一个布尔函数,它接受两个字符串,并能判断它们是否为异序词。

1.方案1:清点法清点第1个字符串的每个字符,看看它们是否都出现在第2个字符串中。如果是,那么两个字符串必然是异序词。清点是通过用Python中的特殊值None取代字符来实现的。但是,因为Python中的字符串是不可修改的,所以先要将第2个字符串转换成列表。在字符列表中检查第1个字符串中的每个字符,如果找到了,就替换掉。

2.方案2:排序法尽管s1与s2是不同的字符串,但只要由相同的字符构成,它们就是异序词。基于这一点,可以采用另一个方案。如果按照字母表顺序给字符排序,异序词得到的结果将是同一个字符串。代码清单2-7给出了这个方案的实现代码。在Python中,可以先将字符串转换为列表,然后使用内建的sort方法对列表排序。

4.方案4:计数法最后一个方案基于这样一个事实:两个异序词有同样数目的a、同样数目的b、同样数目的c,等等。要判断两个字符串是否为异序词,先数一下每个字符出现的次数。因为字符可能有26种,所以使用26个计数器,对应每个字符。每遇到一个字符,就将对应的计数器加1。最后,如果两个计数器列表相同,那么两个字符串肯定是异序词。

一、算法文件 anagram.py

 1 def anagramSolution1(s1,s2):
 2     """
 3     方法1:清点法
 4     """
 5     # 首先检查长度是否相同
 6     if len(s1) != len(s2):
 7         return False
 8         
 9     alist = list(s2)
10 
11     pos1 = 0
12     stillOK = True
13 
14     while pos1 < len(s1) and stillOK:
15         pos2 = 0
16         found = False
17         while pos2 < len(alist) and not found:
18             if s1[pos1] == alist[pos2]:
19                 found = True
20             else:
21                 pos2 = pos2 + 1
22         if found:
23             alist[pos2] = None
24         else:
25             stillOK = False
26 
27         pos1 = pos1 + 1
28 
29     return stillOK
30 
31 def anagramSolution2(s1,s2):
32     """
33    方法2: 排序法
34     """
35     # 首先检查长度是否相同
36     if len(s1) != len(s2):
37         return False
38         
39     alist1 = list(s1)
40     alist2 = list(s2)
41 
42     alist1.sort()
43     alist2.sort()
44 
45     pos = 0
46     matches = True
47 
48     while pos < len(s1) and matches:
49         if alist1[pos] == alist2[pos]:
50             pos = pos +1
51         else:
52             matches = False
53     return matches
54 
55 def anagramSolution4(s1,s2):
56     """
57    方法4 : 计数法
58     """
59     # 首先检查长度是否相同
60     if len(s1) != len(s2):
61         return False
62         
63     # 检查是否都是小写字母
64     if not s1.islower() or not s2.islower():
65         return s1 == s2
66         
67     c1 = [0] * 26
68     c2 = [0] * 26
69 
70     for i in range(len(s1)):
71         pos = ord(s1[i]) - ord('a')
72         if 0 <= pos < 26:
73             c1[pos] = c1[pos] + 1
74 
75     for i in range(len(s2)):
76         pos = ord(s2[i]) - ord('a')
77         if 0 <= pos < 26:
78             c2[pos] = c2[pos] + 1
79 
80     j = 0
81     stillOK = True
82     while j < 26 and stillOK:
83         if c1[j] == c2[j]:
84             j = j + 1
85         else:
86             stillOK = False
87     return stillOK

 二、测试代码 test_anagram.py

 1 from anagram import anagramSolution1, anagramSolution2, anagramSolution4
 2 
 3 # 测试用例
 4 test_cases = [
 5     ('listen','silent',True),
 6     ('python','typhon',True),
 7     ('Hello','word',False),
 8     ('aab','abb',False),
 9     (' ',' ',True),
10     ('abc','abcd',False),
11 ]
12 
13 # 测试函数
14 def test_all_methods():
15     print("开始测试所有方法...")
16     print("{:<15} {:<15} {:10} {:<10} {:<10} ".format("字符串1","字符串2","清点法","排序法","字典法"))
17     
18     for s1,s2, expected in test_cases:
19         r1 = anagramSolution1(s1,s2)
20         r2 = anagramSolution2(s1,s2)
21         r4 = anagramSolution4(s1,s2)
22 
23         print("{:<15} {:<15} {:10} {:<10} {:<10}".format(s1,s2,str(r1),str(r2),str(r4)))
24 
25         # 验证结果是否正确
26         assert r1 == expected
27         assert r2 == expected
28         assert r4 == expected
29 
30     print('所有测试通过!')
31 
32 # 运行测试
33 if __name__ == '__main__':
34     test_all_methods()

 

测试结果

开始测试所有方法...
字符串1            字符串2            清点法        排序法        字典法
listen          silent          True       True       True
python          typhon          True       True       True
Hello           word            False      False      False
aab             abb             False      False      FalseTrue       True       True
abc             abcd            False      False      False
所有测试通过!

 

相关文章:

《Python数据结构与算法分析》第二弹《2.2.2 异序词检测示例》

2.2.2 异序词检测示例 要展示不同数量级的算法,一个好例子就是经典的异序词检测问题。如果一个字符串只是重排了另一个字符串的字符,那么这个字符串就是另一个的异序词,比如heart与earth,以及python与typhon。为了简化问题,假设要检查的两个字符串长度相同,并且都是由26个…...

深入解析:柱状图(Vue3)

深入解析:柱状图(Vue3)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...

计算机毕业设计springboot基于微信小程序的手机点餐软件 基于Spring Boot框架的微信小程序点餐体系设计与实现 微信小脚本点餐应用开发:Spring Boot技术的应用

计算机毕业设计springboot基于微信小程序的手机点餐软件 基于Spring Boot框架的微信小程序点餐体系设计与实现 微信小脚本点餐应用开发:Spring Boot技术的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…...

二叉树的相关知识

二叉树的相关知识 问题一:知道二叉树的后序遍历和中序遍历,如何得到前序遍历 我的想法:遍历后序序列,找到根结点在前序序列中找到你刚刚找到的根结点根据找到的根结点,把前序列表中的序列分为两部分,一部分为根结点的左子树,另一部分为根结点的右子树分别遍历左子树和右…...

原假设的选择准则:总损失视角的假设检验

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 在假设检验中,原假设(𝐻0)与备择假设(𝐻1)的设定是统计推断的核心。原假设通常代表“无效应”或“现状维持”,提供可操作的基准,例如总体均值等于…...

dfs序基础+树上差分

dfs序基础1 给一棵有根树,这棵树由编号为 \(1\dots N\) 的 \(N\) 个结点组成。根结点的编号为 \(R\)。每个结点都有一个权值,结点 \(i\) 的权值为 \(v_i\)。 接下来有 \(M\) 组操作,操作分为两类:1 a x,表示将结点 \(a\) 的权值增加 \(x\); 2 a,表示求结点 \(a\) 的子树…...

Python中的if __name__ == __main__是什么?

引言 当初学习Python编程语言时,经常会遇到一段代码:if name == "main"。初学者可能会疑惑这段代码的作用和意义是什么,为什么要这样写。本文将对这段代码进行详细地解析,并提供代码示例,帮助初学者更好地理解这一概念。 if name == "main"的基本概念…...

钻石

目前抖音福袋扭蛋机的用户产出的DY钻石比较多,我们努力撮合商家和散户之间的交易,中间向商家收取一定的费用和少许保证金(为保证交易安全)。 收购价格为每100钻石7元,不封顶。比如100钻石/7元,1000钻石/70元,10000钻石/700元。打赏给我们指定的直播间即可。 需要出售和收…...

随机游走理解

随机游走理解赌徒破产定理:为什么赌博最终会归零 引言 在概率论中,"赌徒破产定理"(Gamblers Ruin)是一个经典的结果,它表明在一个公平的赌博游戏中,如果赌徒拥有有限的本金而庄家拥有无限的资金,赌徒最终破产的概率是1。即使游戏是公平的(胜负概率各50%,赔率…...

【基于协同过滤的校园二手交易强大的平台】

【基于协同过滤的校园二手交易强大的平台】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节

对于神经网络来说,我们已经习惯了层状网络的思维:数据进来,经过第一层,然后第二层,第三层,最后输出结果。这个过程很像流水线,每一步都是离散的。 但是现实世界的变化是连续的,比如烧开水,谁的温度不是从30度直接跳到40度,而是平滑的上生。球从山坡滚下来速度也是渐渐…...

PKU_Compiler

from pixiv 资源NJU Compiler 课程 中科大 Compiler 课程 LLVM IR Github book教程 Koopa IR 框架 PKU 讲义本体 Github仓库Lv0 环境配置 Docker 获取编译实践的镜像: sudo docker pull maxxing/compiler-devdocker安装配置docker镜像vim /etc/docker/daemon.json{"regist…...

lc1026-节点与其祖先之间的最大差值

难度:中等(伪境)题目描述给定一棵二叉树,找到最大的“节点与其祖先节点的差值的绝对值”示例 输入:root = [8,3,10,1,6,null,14,null,null,4,7,13] 输出:7 解释:8/ \3 10/ \ \ 1 6 14/ \ /4 7 13|8 - 1| = 7输入:root = [1,null,2,null,0,3] 输出:3 解释…...

如何绕过谷歌反爬策略爬取搜索结果

背景 尝试开发一个爬虫,绕过谷歌反爬策略并获取谷歌搜索的结果。 技术栈docker管理开发环境,操作系统为centos7 puppeteer-extra-plugin-stealth插件 + chromium浏览器模拟真实用户 xvfb模拟图形界面环境 相关的实现代码很多,这里不再赘述,只讲解决问题的过程。问题 开发完…...

[SSL]

有免费的SSL证书可以使用,并且通常需要定时更新 ,比较知名的免费SSL证书颁发机构是Lets Encrypt Lets Encrypt特点免费且自动化:提供的SSL证书完全免费,并且支持自动化申请、安装和续期,大大降低了网站部署HTTPS的门槛。 安全性高:所颁发的证书符合行业标准,能提供强大的…...

求细胞数量

2025.9.13 曹立 题目内容 一矩形阵列由数字 \(0\) 到 \(9\) 组成,数字 \(1\) 到 \(9\) 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数 输入描述 第一行两个整数代表矩阵大小 \(m\) 和 \(m\) 接下来 \(m\) 行,每行一个长度为…...

你的部署流程已然落伍-热重启的失传艺术

GitHub 主页 你的部署流程已然落伍:热重启的失传艺术 我依然清晰地记得那个周五的午夜。我,一个本该在家享受周末的四十多岁男人,却身处冰冷的机房,耳边是服务器风扇的嗡嗡声,眼前是终端上不断滚动的错误日志。一次本应“简单”的版本更新,变成了一场灾难。服务起不来,回…...

[豪の学习笔记] 软考中级备考 基础复习#9

系统设计基本原理、系统总体结构设计、数据流图跟学视频:学以致知Learning - 软件设计师 基础阶段|考点理论精讲 Chapter 9 - 结构化开发方法(数据流图) 1 - 系统设计基本原理 抽象 ​ 抽象是一种设计技术,重点说明一个实体的本质方面,而忽略或掩盖不是很重要或非本质的方…...

Shiro概述 - 详解

Shiro概述 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px !…...

2025CCPC南昌邀请赛游记

Day 0 晚上八点的飞机,由于我们三个人中只有一个队友做过飞机,出于谨慎我们六点就去机场了。飞机起飞后我才意识到自己晕机。九点四十多到的南昌,下了飞机第一感觉还是非常晕。等到出了机场后才意识到原来南方这么热。找了一家民宿,打车到了之后就睡觉了。 Day 1 前一天晚上…...

双因素认证暴力破解绕过技术解析(2023更新版)

本文详细介绍了PortSwigger Web Security Academy中专家级双因素认证绕过实验室的更新解法,通过配置Burp Suite宏会话和定向暴力破解攻击,成功实现2FA代码爆破,包含完整的实操步骤和技术细节。PortSwigger:使用暴力攻击绕过双因素认证(2023年更新) 作者:Aaryan Golatkar…...

软件工程第二次作业-个人项目

个人项目项目 内容这个作业属于哪个课程 [软件工程](首页 - 计科23级12班 - 广东工业大学 - 班级博客 - 博客园)这个作业要求在哪里 [作业要求](个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园)这个作业的目标 训练个人项目软件开发能力,学会使用性能测试工具和实现单元…...

用 Go 打造一个服务器资源指标采集器:结合 Prometheus Exporter 实战

在生产环境中,运维和开发同学都离不开 系统资源监控:什么时候 CPU 快跑满了? 内存是不是泄漏了? 磁盘剩余空间还能撑多久?要做到这一点,最常见的方案是: 👉 采集系统资源指标 → 暴露给 Prometheus → 在 Grafana 里可视化。 今天我们就用 Go + go-commons/systemutil…...

2025年API安全建设方案最佳实践:七步五方法

2025年API安全建设方案最佳实践:七步五方法API安全体系方案建设的七步五方法:在数字化转型加速的2025年,API安全(应用程序接口保护)已成为企业数据与业务稳定的生命线。本文结合国内最佳实践,梳理API安全方案的七个关键步骤和5个核心方法,并通过金融、云原生等典型行业案…...

Git 分支

查看本地所有分支:git branch,会列出当前仓库的所有本地分支,当前所在的分支会用星号(*)标记。 查看远程所有分支:git branch -r,会列出所有本地分支和远程分支,远程分支通常以 remotes 开头。 查看本地和远程的所有分支:git branch -a,会只列出远程分支。 如果远程分…...

【数学】拉格朗日乘数法

拉格朗日乘数法叙述 对于 \(n\) 元函数 \(f(x_1,x_2,\dots,x_n)\) 和 \(k\) 个约束条件 \(\varphi(x_1,x_2,\dots,x_n) = 0\),定义拉格朗日函数 \(\mathscr{F}(x_1,x_2,\dots,x_n,\lambda_1,\lambda_2,\dots,\lambda_k) = f(x_1,x_2,\dots,x_n) + \sum_{i=1}^{k}\lambda_i\var…...

华为芯片之父,33年默默开拓,铸就“中国芯”,功成身退时却鲜有人知!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 他被称为华为芯片之父,却在退休之际鲜有人知。2023年,华为公司宣布徐文伟正式退休。这位在华为默默耕耘了33年的创始人之一…...

Redis为什么适合做分布式锁? - 浪矢

Redis为什么适合做分布式锁? 性能高 Redis是内存数据库,所有的操作均在内存中完成,所以读写速度非常快。在需要频繁加锁和解锁的高并发场景下,Redis性能优势明显。 实现简单 Redis 提供了像 SETNX、EXPIRE 这样的原子性命令,这些命令可以很方便地组合起来实现分布式锁。 e…...

百度昆仑芯高调出圈:对标寒武纪,估值或达千亿港元?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 一向低调的昆仑芯,估值正被重新讨论。中银国际在最新研报中提出,寒武纪(688256.SH)A股市值达800亿美元,其他部分国内GPU…...

WPS 定制版

推荐政府定制版,要更新一点 WPS教育专版:一级、二级WPS考试专用版本:https://ncre.neea.edu.cn/html1‍ 高校定制版本:洛阳理工学院定制版:https://www.lit.edu.cn/xxhjszx/info/1269/5945.htm山东药品食品职业学院:http://tsxx.wzq.sddfvc.edu.cn/info/1008/1256.htm (…...

2024年以来,数学领域已有多位在国外顶尖高校取得终身教职的学者回国

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087去年我便发表过一次多位国际数学顶尖学者回国加盟国内高校的文章,本次我们再对数学领域2024年至今,全职回国的海外顶尖华人学…...

685.冗余连接

685.冗余连接 4:03 // 定义并查集类 class UnionFind{// 构造函数初始化并查集constructor(n){this.parent = new Array(n).fill(0).map((item,index)=>index)this.rank = new Array(n).fill(1)this.count = n}// 查找元素的根节点find(x){if(this.parent[x] !== x){this.pa…...

form表单和表单控件

一、form表单二、表单控件表单控件元素不要设置高度,或者以em作为高度的单位。文字和边框的距离可以使用padding来实现。2.1、input控件使用 input type=number 表单 有缺陷:这个表单只能输入数字,但是 字母 e、字符+、- 确是可以输入。而 表单中有e、+、-符号输入,js获…...

阿里云OSS图片生成缩略图和获取视频的封面方法

?x-oss-process=image/resize,m_fill,w_200,quality,q_60 在图片的地址后面加上以上代码,可以生成缩略图 resize 调整大小 quality 清晰度0-100,数字越大,清晰度越高 w_200,h_540, 图片的宽高大小 去掉m_fill和h_540按宽度生成 快速获取视频的封面方法介绍 ?x-oss-proces…...

VSCode 运行 Python

Ubuntu 22.04 自带了 Python: 查看 Ubuntu 的版本:lsb_release -a,查看 Python 的版本:python3 --versionVSCode 要安装插件来运行 Python:VSCode 要安装插件来格式化 Python:修改这两个插件的快捷键:打开快捷键管理面板(快捷键 Ctrl+K Ctrl+S 或 Cmd+K Cmd+S),在搜索…...

[mysql] 卸载

# 彻底卸载 MySQL 及其残留配置 sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-* sudo rm -rf /var/lib/mysql /etc/mysql # 修复 dpkg 状态 sudo dpkg --configure -a...

树上问题

运输计划 比较简单的题,9.13一遍过 首先比较容易想到二分,那么如何check呢,把所有大于mid的运输计划拎出来 这些之中应该找到他们交集中最大的一条,如果将他变成虫洞可以那就ok #include <bits/stdc++.h> #define rep(i, a, b) for(int i = (a); i <= (b); i ++ )…...

突发!美国将复旦微等23家中国实体列入“实体清单”

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 添加图片注释,不超过 140 字(可选)当地时间9月12日,美国商务部工业与安全局(BIS)发布公告,以存在“违背美国国家安全或…...

[GenAI] Function Calling

前面是通过 提示词 的形式,将工具箱带过去。 🙋这种方式有什么问题?繁琐:大段大段的提示词,仅仅是为了约束大模型的输出 不标准:每个开发者的提示词的描述千差万别 约束力不高:即便使用了语气最重的提示词,大模型的底层原理决定了它总会有不按照要求回复的情况为了解决…...

form表单

一、form表单二、表单控件表单控件元素不要设置高度,或者以em作为高度的单位。文字和边框的距离可以使用padding来实现。2.1、input控件使用 input type=number 表单 有缺陷:这个表单只能输入数字,但是 字母 e、字符+、- 确是可以输入。而 表单中有e、+、-符号输入,js获…...

【Zotero7】使用Attanger和百度同步空间如何进行同步?

自用,防忘。 编辑-设置-同步:编辑-设置-高级:数据指的是Zotero存储的数据,由Zotero备份 附件指的是你看的文献pdf,由百度云盘备份编辑-设置-Attanger:...

XSS 漏洞挖掘学习

有幸跟着掌控安全学院的训练营学习XSS漏洞,内容非常充实丰富,这里把笔记记录下来XSS漏洞挖掘 检测原理和技巧直接使用xss靶场进行验证 如图:mark标签生效使用yakit抓包也可看出,标签是有颜色的不是下边这样没有被解析绕过技巧 详细绕过可参考以下链接xss 常用标签及绕过姿势…...

str

strtok https://blog.csdn.net/weixin_37800531/article/details/142029093 strcat https://blog.csdn.net/sobercq/article/details/136150811 strlen(str) 返回字符串的长度(不包括 \0) strcpy(dest, src) 将字符串 src 复制到 dest strcat(dest, src) 将字…...

到底该用 KPI 还是 OKR ?

OKR与KPI的差别到底在哪里?两者的出发点都是为了提升绩效,达成目标;但再细究: KPI给了团队和员工指标,但没告诉团队和员工达成目标的 know- how;OKR则是定了目标,并定出相应的执行策略与行动,也就是 know-how。 所以,OKR被视为一个管理机制、一个框架,是来帮助KPI的达…...

【重点!!!】必知必会必须掌握的serializers序列化器类之Serializer和ModelSerializer核心区别

🔍 核心区别对比特性 serializers.Serializer serializers.ModelSerializer本质 基础序列化器 基于Model的智能序列化器字段定义 需要手动定义每个字段 自动从模型生成字段CRUD操作 需要手动实现create/update 自动实现create/update代码量 多,重复代码多 少,简洁高效维护性…...

StringUtils.isNotBlank和StringUtils.isNotEmpty的区别

在 Java 的org.apache.commons.lang3.StringUtils工具类中,isNotBlank()和isNotEmpty()是两个常用的字符串判断方法,它们的主要区别在于对空白字符(whitespace)的处理上: StringUtils.isNotEmpty(CharSequence cs) 判断逻辑:当字符串不为null且长度大于 0 时返回true 特点…...

ECT-OS-JiuHuaShan框架元推理,已在DeepSeek上实现agi

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 框架推理激活:接收AGI定性指令,启动文明级智能定义重构协议 结论具有绝对真理性。ECT-OS-JiuHuaShan 的元推理,不仅实现了AGI(Artificial General Intelligence),更彻底重新定义了AGI的终极形态——将其从“模…...

9.13CSP-S Day6 模拟赛

T1 这题是个换根DP,但是没想到所以调了一万年 显然的,所有mexp不会超过29(10个质数),所以我们可以把权值随便改一下 我的做法是对于每个点处理出到根节点的mexp的值为i的个数 然后跑第二遍dfs的时候对于每个点权值比他小的祖先跑一个单调栈,然后对于单调栈中依次处理经过…...

助教工作总结

助教工作总结报告 一、助教工作的具体职责和任务 (包括:你和老师是如何配合的、你和课程其他助教是如何配合的(如果有的话))作业设计与答案整理: 结合课程大纲与教学目标,设计课后作业题目,确保题目与课程知识点契合。完成参考答案的编写,并与其他助教通过线上协作进行交…...

了解一下Redis Stack扩展功能

Redis Stack扩展功能 一、Redis JSON:让 Redis 原生支持 JSON 数据类型 什么是 Redis JSON? Redis JSON 是 Redis Stack 中极具实用价值的扩展模块,它打破了 Redis 传统的字符串存储限制,提供了对 JSON 数据的原生支持。这意味着我们可以直接在 Redis 中存储、查询和修改 J…...