浙大python判断两个字符串是否为变位词_python数据结构与算法 变位词
变位词
问题简述
“变位词”判断问题:所谓 "变位词" 是指两个词之间存在组成字母的重新排列关系,例如 Heart 和 Earth,python 和 typhon,为了简单起见,假设参与判断的两个词仅由小写字母组成,而且长度相等
解题目标
写一个 bool 函数,以两个词作为参数,返回这两个词是否为变位词
意义
用于展示解决统一问题的不同数量级的算法的差距
解法一:逐字检查
假设要检查的字符串记为 A 和 B,一个很显然的思路是把 A 中的每一个字符都到 B 中去检查看是否存在,如果存在就“打勾”(以防重复检查),如果每个字符都能找到,则两个词是变位词,但凡有 1 个字符找不到,就不是变位词
思路很简单,但这里面有个小细节:应该如何实现“打勾”呢?其实很简单,只需要给抹掉,下一次就不会再检索到它了,然而字符串并非可变类型,所以我们需要 list 来做中转,下面给出具体实现和详细注释:def anagramSolution(s1,s2):
s_list = list(s2) # 将第二个字符串转为可变类型list
pos1 = 0 # 用来遍历第一个字符串的指针
stillOk = True # 只要有一个没找到,就不是变位词
while pos1 < len(s1) and stillOk: # 因为s1和s2的长度一定是一样的,所以直接遍历s1
pos2 = 0 #遍历第二个列表字符串的指针
found = False # 一开始当然是什么都没有找到
while pos2 < len(s_list) and not found: # 拿着s1的第一个元素检查s2中的每一个
if s1[pos1] == s_list[pos2]: #如果发现一样的元素
found = True #说明找到了一个
else: # 如果没找到
pos2 = pos2 + 1 # 看下一个
if found: # 如果找到了
s_list[pos2] = None # 抹掉
else: # 但凡有一个没找到
stillOk = False # 就不需要继续了
pos1 = pos1 + 1 # 取出s1中的下一个元素继续检查s2
return stillOk # 返回结果
解法一:算法分析
问题的规模:
词中包含的字符个数 n
最耗时的部分:
两重循环,这里不给出推导过程,数量级为 n 的平方
解法二:排序比较
首先将两个字符串都按照字母顺序排好序,只要构成元素相同,最后排完序的结果一定也是相同的,我们只需要检查两个字符串是否相同就可以了,相同则是变位词,不相同则不是变位词
如何排序?这里我们直接引用 python 中 list 提供的方法sort直接进行排序,它可以直接修改原有的 list
我们来看具体实现,仍然比较简单:def anagramSolution(s1,s2):
alist1 = list(s1)
alist2 = list(s2) #先把两个字符串都转化为list
match = True # 用来检查两个list是否相同
pos = 0 # 同步检测两个list的对应位置
alist1.sort()
alist2.sort() # 为两个列表排好序
while pos < len(alist1) and match: # 这一段是检查两个列表是否完全相同
if alist1[pos] == alist2[pos]:
pos = pos + 1
else: # 只要有一个不相同
match = False # 就是不匹配
return match
解法二:算法分析
可以看到,改进过的算法比原有的方法简洁的多, 那么时间复杂度如何呢?
复杂度分析
粗看过去,改进过的算法似乎只有一个循环,最多执行 n 次
但是,在循环之前的两个 sort并非没有任何代价,它的运行时间数量级约为 n 倍的 log n,大于循环所执行的 n
因此,本算法中最耗时的部分应为排序过程,时间复杂度为 n log n
解法三:计数比较
对比两个词中每个字母出现的次数,如果 26 个字母出现的次数都相同的话,这两个字符串一定是变位词
为每个词设置一个 26 位的计数器,先检查每个词,在计数器中设定好每个字母出现的次数
计数器完成后,进入比较阶段,看两个字符串的计数器是否相同,如果相同则输出是变位词的结论
下面给出代码演示:def anagramSolution(s1,s2):
c1 = [0]*26
c2 = [0]*26 #分别设置计数器
for i in range(len(s1)):
pos = ord(s1[i])-ord('a') # ord表示转化为编码,来计算出在计数器中的偏移位置
c1[pos] = c1[pos] + 1 #对应位置计数器累加
for i in range(len(s2)): # 对另一个也做相同的操作
pos = ord(s2[i])-ord('a')
c2[pos] = c2[pos]+1
j = 0 # 从这里开始比较两个计数器是否相同,和上面的解法一样
stillOk = True
while j < 26 and stillOk:
if c1[j] == c2[j]:
j = j + 1
else:
stillOk = False
return stillOk
解法三:算法分析
虽然看起来有三个循环,但可以发现并非嵌套的循环,最后一次循环是比较计数器,其时间是固定的,所以算法复杂度是 2n + 26,其数量级为 n,是三个算法中性能最好的
小结
解决相同问题时合理的算法优化可以显著提高性能
浙大python判断两个字符串是否为变位词_python数据结构与算法 变位词相关推荐
- 浙大python判断两个字符串是否为变位词_算法2----------变位词
1.背景: 变位词指的是一个单词可以通过改变其他单词中字母的顺序来得到,也叫做兄弟单词,如army->mary. 题1:判断两个字符串s1和s2是否为变位词. 经典的字符串变位词检测问题是比较不 ...
- 浙大python判断两个字符串是否为变位词_Python实现对变位词的判断
Python实现对变位词的判断 什么是变位词呢?即两个单词都是由相同的字母组成,而各自的字母顺序不同,譬如python和typhon,heart和earth. 变位词的判断 既然我们知道了变位词的定义 ...
- Python判断两个字符串是否为父子集
两个问题的区别在于是否判断元素的数量 问题一:字符串s是否含有字符串t所有种类元素 实例一: s='a' t='aaa' print(set(t).issubset(set(s))) "&q ...
- python中如何判断两个字符串是否相等_python怎样判断两个字符串是否相同
原标题:python怎样判断两个字符串是否相同 python中,判断两个字符串是否相等或一样,可以使用==或者is来判断:判断不一样可以使用 is not. 示例 使用注意事项 1.有时候两个字符串打 ...
- Python中判断两个字符串的内容是否相同
1 前言 今天在划分数据集的时候,需要判断两个字符串的内容是否相同,这个之前查过,不过好像忘记了,所以想着再记录一下- 2 Python中判断两个字符串的内容是否相同 使用"==" ...
- Python字符串比较:如何判断两个字符串是否相等?
Python字符串比较:如何判断两个字符串是否相等? 在Python编程中,字符串是最常用的数据类型之一.当我们需要比较两个字符串时,通常需要判断它们是否相等.这篇文章将详细介绍Python中比较两个 ...
- python判断字符串不相等_python怎么判断两个字符串不相等
字符串操作是编程语言中经常用到的,常见的有字符串增.删.改.查.在python中,判断两个字符串是否相等或一样,可以使用==或者is来判断:判断不一样可以使用 is not. 示例 使用注意事项 1. ...
- Python判断两个文件夹中互相不同的文件有哪些、判断一个文件夹相对于另外一个文件夹缺少了哪些文件
Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些文件 目录 Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些 ...
- 判断两个字符串是否是变形词
问题: 给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样并且每种字符出现的次数也一样,那么str1与str2互为变形词.请实现函数判断两个字符串是否互为变形词. 举例: s ...
最新文章
- cv::Mat dst 这句话从语法是怎么理解?
- RHEL6入门系列之二十七,源码安装及软件安装综合实例
- LintCode 387: Smallest Difference
- html 使用百度搜索,百度搜索uzer,进入主页
- 我的log4net使用手册(转自 http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx)
- 哈啰出行架构调整:两轮电动车租售平台将升级为独立事业部
- 内核驱动系列--内核调试方法
- 个性时钟屏保=冷高轮时间麻将时钟电脑屏幕保护
- 如何让图片按照1 2 3排列不带括号
- 共享的计算机用户账户限制,共享问题:登录失败: 用户帐户限制
- 我的CSDN博客文章,被大学老师、本科生、公司 “引用“ 了!
- 锁相环倍频原理简要分析
- 学Python运维,这知识点你肯定会遇到,【必收藏之】nginx 域名跳转相关配置
- 亳州学院计算机查询网址,亳州学院教务管理系统入口http://www.bzuu.edu.cn/jwc/
- 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)
- vue 仿豆瓣 爬坑之旅
- Mysql关联查询的几种方式(详解)
- TCP/UDP端口大全
- 学习累了休息一下——————看完不笑你厉害
- CodeBlock速配wxWidgets[U版]
热门文章
- Spring中的p标签(转)good
- ios 中的关联对象
- Qt之进程间通信(IPC)
- SQL Server 2000 To SQL Server 2005
- nyoj-619 青蛙过河
- NYOJ 648 数字1的数量
- CodeForce 236B Easy Number Challenge(筛法求素数 + 整数因式分解)
- python上的数据库sqlite3——插入多行数据
- 5-Error:failed to find Build Tools revision 28.0.0 rc1解决方案
- Java笔记(七)HashMap和HashSet