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入门篇之字符串
Oct 17 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
python 上下文管理器使用方法小结
Oct 10 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
浅谈Python反射 &amp; 单例模式
Mar 21 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
python实现简单学生信息管理系统
Apr 09 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
一文搞懂python异常处理、模块与包
Jun 26 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
比较好用的PHP防注入漏洞过滤函数代码
2012/04/11 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
2020/03/03 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
vue cli webpack中使用sass的方法
2018/02/24 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
JS实现密码框效果
2020/09/10 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
幼儿园中秋节活动反思
2014/02/16 职场文书
政府法律服务方案
2014/06/14 职场文书
求职简历自荐信
2014/06/18 职场文书
遗失说明具结保证书
2015/02/26 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android