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 字符串操作实现代码(截取/替换/查找/分割)
Jun 08 Python
python正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
python根据距离和时长计算配速示例
Feb 16 Python
pyqt4教程之widget使用示例分享
Mar 07 Python
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
Python中为feedparser设置超时时间避免堵塞
Sep 28 Python
python实现自动重启本程序的方法
Jul 09 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
浅谈pandas dataframe对除数是零的处理
Jul 20 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异步调用socket实现代码
2012/01/12 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
DOM 基本方法
2009/07/18 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
JavaScript类的写法
2016/09/17 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
简单了解python关系(比较)运算符
2019/07/08 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python生成词云的实现代码
2020/01/14 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
Python 防止死锁的方法
2020/07/29 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
报关专员求职信范文
2014/02/22 职场文书
人事任命书怎么写
2014/06/05 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
Java使用JMeter进行高并发测试
2021/11/23 Java/Android