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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
python实现统计代码行数的方法
May 22 Python
Python入门之三角函数sin()函数实例详解
Nov 08 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
Python判断有效的数独算法示例
Feb 23 Python
Pandas DataFrame中的tuple元素遍历的实现
Oct 23 Python
Python中__repr__和__str__区别详解
Nov 07 Python
python scrapy重复执行实现代码详解
Dec 28 Python
Python终端输出彩色字符方法详解
Feb 11 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
Django Paginator分页器的使用示例
Jun 23 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
php使用Imagick生成图片的方法
2015/07/31 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
php利用递归实现删除文件目录的方法
2016/09/23 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
Python实现文件信息进行合并实例代码
2018/01/17 Python
Python学习小技巧总结
2018/06/10 Python
利用Python如何生成便签图片详解
2018/07/09 Python
python-opencv颜色提取分割方法
2018/12/08 Python
Python 互换字典的键值对实例
2019/02/12 Python
Python3 中作为一等对象的函数解析
2019/12/11 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
创业资金计划书
2014/02/06 职场文书
自立自强的名人事例
2014/02/10 职场文书
消防应急演练方案
2014/02/12 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
护士先进个人总结
2015/02/13 职场文书
新员工试用期自我评价
2015/03/10 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
Django框架中模型的用法
2022/06/10 Python