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远程桌面协议RDPY安装使用介绍
Apr 15 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
Python线程条件变量Condition原理解析
Jan 20 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
Python selenium爬取微博数据代码实例
May 22 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
python 实现IP子网计算
Feb 18 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
一个MYSQL操作类
2006/11/16 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
PHP异常处理浅析
2015/05/12 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
python进程管理工具supervisor使用实例
2014/09/17 Python
跟老齐学Python之折腾一下目录
2014/10/24 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
基于Python的关键字监控及告警
2017/07/06 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
Python交互式图形编程的实现
2019/07/25 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
自我鉴定范文300字
2013/10/01 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
学生保证书
2015/01/16 职场文书
协议书格式模板
2016/03/24 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
详解PyTorch模型保存与加载
2022/04/28 Python
Mysql开启外网访问
2022/05/15 MySQL
SQL中的连接查询详解
2022/06/21 SQL Server