变位词

问题简述

“变位词”判断问题:所谓 "变位词" 是指两个词之间存在组成字母的重新排列关系,例如 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数据结构与算法 变位词相关推荐

  1. 浙大python判断两个字符串是否为变位词_算法2----------变位词

    1.背景: 变位词指的是一个单词可以通过改变其他单词中字母的顺序来得到,也叫做兄弟单词,如army->mary. 题1:判断两个字符串s1和s2是否为变位词. 经典的字符串变位词检测问题是比较不 ...

  2. 浙大python判断两个字符串是否为变位词_Python实现对变位词的判断

    Python实现对变位词的判断 什么是变位词呢?即两个单词都是由相同的字母组成,而各自的字母顺序不同,譬如python和typhon,heart和earth. 变位词的判断 既然我们知道了变位词的定义 ...

  3. Python判断两个字符串是否为父子集

    两个问题的区别在于是否判断元素的数量 问题一:字符串s是否含有字符串t所有种类元素 实例一: s='a' t='aaa' print(set(t).issubset(set(s))) "&q ...

  4. python中如何判断两个字符串是否相等_python怎样判断两个字符串是否相同

    原标题:python怎样判断两个字符串是否相同 python中,判断两个字符串是否相等或一样,可以使用==或者is来判断:判断不一样可以使用 is not. 示例 使用注意事项 1.有时候两个字符串打 ...

  5. Python中判断两个字符串的内容是否相同

    1 前言 今天在划分数据集的时候,需要判断两个字符串的内容是否相同,这个之前查过,不过好像忘记了,所以想着再记录一下- 2 Python中判断两个字符串的内容是否相同 使用"==" ...

  6. Python字符串比较:如何判断两个字符串是否相等?

    Python字符串比较:如何判断两个字符串是否相等? 在Python编程中,字符串是最常用的数据类型之一.当我们需要比较两个字符串时,通常需要判断它们是否相等.这篇文章将详细介绍Python中比较两个 ...

  7. python判断字符串不相等_python怎么判断两个字符串不相等

    字符串操作是编程语言中经常用到的,常见的有字符串增.删.改.查.在python中,判断两个字符串是否相等或一样,可以使用==或者is来判断:判断不一样可以使用 is not. 示例 使用注意事项 1. ...

  8. Python判断两个文件夹中互相不同的文件有哪些、判断一个文件夹相对于另外一个文件夹缺少了哪些文件

    Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些文件 目录 Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些 ...

  9. 判断两个字符串是否是变形词

    问题: 给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样并且每种字符出现的次数也一样,那么str1与str2互为变形词.请实现函数判断两个字符串是否互为变形词. 举例: s ...

最新文章

  1. cv::Mat dst 这句话从语法是怎么理解?
  2. RHEL6入门系列之二十七,源码安装及软件安装综合实例
  3. LintCode 387: Smallest Difference
  4. html 使用百度搜索,百度搜索uzer,进入主页
  5. 我的log4net使用手册(转自 http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx)
  6. 哈啰出行架构调整:两轮电动车租售平台将升级为独立事业部
  7. 内核驱动系列--内核调试方法
  8. 个性时钟屏保=冷高轮时间麻将时钟电脑屏幕保护
  9. 如何让图片按照1 2 3排列不带括号
  10. 共享的计算机用户账户限制,共享问题:登录失败: 用户帐户限制
  11. 我的CSDN博客文章,被大学老师、本科生、公司 “引用“ 了!
  12. 锁相环倍频原理简要分析
  13. 学Python运维,这知识点你肯定会遇到,【必收藏之】nginx 域名跳转相关配置
  14. 亳州学院计算机查询网址,亳州学院教务管理系统入口http://www.bzuu.edu.cn/jwc/
  15. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)
  16. vue 仿豆瓣 爬坑之旅
  17. Mysql关联查询的几种方式(详解)
  18. TCP/UDP端口大全
  19. 学习累了休息一下——————看完不笑你厉害
  20. CodeBlock速配wxWidgets[U版]

热门文章

  1. Spring中的p标签(转)good
  2. ios 中的关联对象
  3. Qt之进程间通信(IPC)
  4. SQL Server 2000 To SQL Server 2005
  5. nyoj-619 青蛙过河
  6. NYOJ 648 数字1的数量
  7. CodeForce 236B Easy Number Challenge(筛法求素数 + 整数因式分解)
  8. python上的数据库sqlite3——插入多行数据
  9. 5-Error:failed to find Build Tools revision 28.0.0 rc1解决方案
  10. Java笔记(七)HashMap和HashSet