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 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
python实现挑选出来100以内的质数
Mar 24 Python
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 Python
Python使用三种方法实现PCA算法
Dec 12 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
Python判断一个文件夹内哪些文件是图片的实例
Dec 07 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 Python
python 字段拆分详解
Dec 17 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 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
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python将xml和xsl转换为html的方法
2015/03/10 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
django中模板的html自动转意方法
2018/05/27 Python
Python实现密码薄文件读写操作
2019/12/16 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
物流创业计划书
2014/02/01 职场文书
学校课外活动总结
2014/05/08 职场文书
品质标语大全
2014/06/21 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
python使用BeautifulSoup 解析HTML
2022/04/24 Python