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使用ctypes模块调用windowsapi获取系统版本示例
Apr 17 Python
python获得一个月有多少天的方法
Jun 04 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
PyTorch学习笔记之回归实战
May 28 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
python执行CMD指令,并获取返回的方法
Dec 19 Python
Python参数传递对象的引用原理解析
May 22 Python
Python如何获取文件指定行的内容
May 27 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
Selenium alert 弹窗处理的示例代码
Aug 06 Python
Python爬虫进阶之爬取某视频并下载的实现
Dec 08 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的字符串用法小结
2010/06/08 PHP
jquery 学习笔记一
2010/04/07 Javascript
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
基于vue.js中事件修饰符.self的用法(详解)
2018/02/23 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
Python 正则表达式的高级用法
2016/12/04 Python
Python判断两个对象相等的原理
2017/12/12 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python编写Windows Service服务程序
2018/01/04 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
现场施工员岗位职责
2014/03/10 职场文书
小学开学标语
2014/07/01 职场文书
党员对照检查材料
2014/09/22 职场文书
2015年测量员工作总结
2015/05/23 职场文书
全陪导游词开场白
2015/05/29 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
话题作文之自信作文
2019/11/15 职场文书