python实现对变位词的判断方法


Posted in Python onApril 05, 2020

Python实现对变位词的判断,供大家参考,具体内容如下

什么是变位词呢?即两个单词都是由相同的字母组成,而各自的字母顺序不同,譬如python和typhon,heart和earth。

变位词的判断

既然我们知道了变位词的定义,那么接下来就是实现对两个单词是否是变位词进行判断了,以下展示变位词判断的几种解法:

1、逐字检查

将单词1中的所有字符逐个到单词2中检查是否存在对应字符,存在就标记
实现:将词2中存在的对应字符设置None,由于字符串是不可变类型,需要先将词2字符复制到列表中
时间复杂度:O(n^2)

def anagramSolution1(s1,s2):
 alist = list(s2) # 复制s2
 pos1 = 0
 stillok = True
 while pos1 < len(s1) and stillok: # 循环s1的所有字符
  pos2 = 0
  found = False  # 初始化标识符
  while pos2 < len(alist) and not found:  # 与s2的字符逐个对比
   if s1[pos1] == alist[pos2]:
    found = True
   else:
    pos2 = pos2 + 1
  if found:
   alist[pos2] = None # 找到对应,标记
  else:
   stillok = False # 没有找到,失败
  pos1 = pos1 + 1
 return stillok
print(anagramSolution1('python','typhon'))

2、排序比较

实现:将两个字符串都按照字母顺序重新排序,再逐个比较字符是否相同
时间复杂度:O(n log n)

def anagramSolution2(s1,s2):
 alist1 = list(s1)
 alist2 = list(s2)

 alist1.sort()   # 对字符串进行顺序排序
 alist2.sort()
 pos = 0
 matches = True
 while pos < len(s1) and matches:
  if alist1[pos] == alist2[pos]:  # 逐个对比
   pos = pos + 1
  else:
   matches = False
 return matches
print(anagramSolution2('python','typhon'))

3、穷尽法

将s1的字符进行全排列,再查看s2中是否有对应的排列
时间复杂度为n的阶乘,不适合作为解决方案

4、计数比较

将两个字符串的字符出现的次数分别统计,进行比较,看相应字母出现的次数是否一样
时间复杂度:O(n),从时间复杂度角度而言是最优解

def anagramSolution4(s1,s2):
 c1 = [0] * 26
 c2 = [0] * 26
 for i in range(len(s1)):
  pos = ord(s1[i]) - ord('a')  # ord函数返回字符的Unicode编码,此语句可以将字符串中的字母转换成0-25的数字
  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
print(anagramSolution4('python','typhon'))

总结

从以上几种解法可以看出,要想在时间上获得最优就需要牺牲空间存储,因此没有绝对的最优解,只有在一定的平衡下,才能找到一个问题相对稳定的解决方案。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
使用DataFrame删除行和列的实例讲解
Apr 08 Python
TensorFlow损失函数专题详解
Apr 26 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
python os.path模块常用方法实例详解
Sep 16 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
python输入错误后删除的方法
Oct 12 Python
python列表推导和生成器表达式知识点总结
Jan 10 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
浅析Python 序列化与反序列化
Aug 05 Python
python如何判断IP地址合法性
Apr 05 #Python
Python按照list dict key进行排序过程解析
Apr 04 #Python
Django高并发负载均衡实现原理详解
Apr 04 #Python
Django调用支付宝接口代码实例详解
Apr 04 #Python
基于python检查SSL证书到期情况代码实例
Apr 04 #Python
python zip,lambda,map函数代码实例
Apr 04 #Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 #Python
You might like
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
python实现简单flappy bird
2018/12/24 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
如何用Python绘制3D柱形图
2020/09/16 Python
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
基层工作经历证明
2014/01/13 职场文书
团日活动总结怎么写
2014/06/25 职场文书
2014司机年终工作总结
2014/12/05 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
python实现A*寻路算法
2021/06/13 Python
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
mysql 获取相邻数据项
2022/05/11 MySQL