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实现udp数据报传输的方法
Sep 26 Python
Python中类型关系和继承关系实例详解
May 25 Python
Python实现将xml导入至excel
Nov 20 Python
Python+request+unittest实现接口测试框架集成实例
Mar 16 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
在Python中增加和插入元素的示例
Nov 01 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
Python多线程thread及模块使用实例
Apr 28 Python
python tkinter实现连连看游戏
Nov 16 Python
python中zip()函数遍历多个列表方法
Feb 18 Python
安装pytorch时报sslerror错误的解决方案
May 17 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
Python中的with...as用法介绍
2015/05/28 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
python实现五子棋程序
2020/04/24 Python
python开发入门——列表生成式
2020/09/03 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
车间操作工岗位职责
2013/12/19 职场文书
会计专业自我鉴定范文
2013/12/29 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
文明工地标语
2014/06/16 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
大学生逃课检讨书
2015/05/04 职场文书
军训决心书范文
2015/09/22 职场文书
小学教师教学反思
2016/02/24 职场文书
sql查询结果列拼接成逗号分隔的字符串方法
2021/05/25 SQL Server
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python
golang生成vcf通讯录格式文件详情
2022/03/25 Golang