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算法学习之计数排序实例
Dec 18 Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
Django 反向生成url实例详解
Jul 30 Python
python Django框架实现web端分页呈现数据
Oct 31 Python
Python连接字符串过程详解
Jan 06 Python
利用python下载scihub成文献为PDF操作
Jul 09 Python
用pushplus+python监控亚马逊到货动态推送微信
Jan 29 Python
Django使用echarts进行可视化展示的实践
Jun 10 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
linux下实现定时执行php脚本
2015/02/13 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
JavaScript分析、压缩工具JavaScript Analyser
2014/12/31 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
js实现动态时钟
2020/03/12 Javascript
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
python中tab键是什么意思
2020/06/18 Python
python 绘制场景热力图的示例
2020/09/23 Python
python Tornado框架的使用示例
2020/10/19 Python
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
秋季运动会广播稿
2014/02/22 职场文书
微信营销策划方案
2014/02/24 职场文书
运动会演讲稿200字
2014/08/25 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
python内置进制转换函数的操作
2021/06/02 Python