python求解数组中两个字符串的最小距离


Posted in Python onSeptember 27, 2018

题目:

给定一个数组 strs,其中的数据都是字符串,给定两个字符串 str1,str2。如果这两个字符串都在 strs数组中,就返回它们之间的最小距离;如果其中任何一个不在里面,则返回 -1;如果两个字符串相等,则返回 0。

例如:给定[‘*','3','*','5','10','9','7','1','*'],再给定两个字符串'* ‘和'9',通过函数求得返回值 3。

分析:有两种方法

方法1:

遍历数组 strs,分别记录两个 str1 和 str2 的位置。求得最小的一个距离数字。这样做时间复杂度为 o(n^2)。

方法2: 

如果查询的次数非常多,为了提高查询的效率,构造Hash表,把每次查询的时间复杂度下降到 o(1)。 
Python 的内置 dict 类型就是哈希表,实现方法也是hash 表,其查询的时间复杂度就是 o(1)。哈希表的构造也分很多种: 
比如,构造 Hash 表,key值是strs中的每一个字符串,value值是一个hash表,里面存放着该字符串到其它字符串的最小距离。 
写成代码就是:hash_table = {“*”:{“3”:1, “5”:1, “10”:2, “9”:3, “7”:2, “1”:1}} 
当然这种方法的空间复杂度是 o(n^2)

代码: 

def min_distance_1(strs, str1, str2):
  '''
  数组中两个字符串的最小距离,这是方法1,时间复杂度 o(n^2)
  :param strs: 给定的数组中存放有多个字符串
  :param str1: 第一个字符串
  :param str2: 第二个字符串
  :return: 如果其中给定的一个字符串不在数组 strs 中,那么返回-1,否则返回两个字符串之间的最小间距
  '''
  if str1 not in strs or str2 not in strs:
   return -1
  if str1 == str2:
   return 0
  dist, min = 1, len(strs)
  pos1, pos2 = 0, len(strs)
  for i in xrange(0, len(strs)):
   if str1 == strs[i]:
    pos1 = i
    for j in xrange(0, len(strs)):
     if str2 == strs[j]:
      pos2 = j
     dist = abs(pos1 - pos2)
     if dist < min:
      min = dist
  return min

 def min_distance_2(strs, str1, str2):
  '''
  数组中两个字符串的最小距离,这是方法2,如果查询的次数非常多,把每次查询的时间复杂度下降到 o(1)。
  Python 的内置 dict 类型就是哈希表,实现方法也是hash 表,其查询的时间复杂度就是 o(1)。哈希表的构造也分很多种:
  比如,构造 Hash 表,key值是strs中的每一个字符串,value值是一个hash表,里面存放着该字符串到其它字符串的最小距离。
   写成代码就是:hash_table = {"*":{"3":1, "5":1, "10":2, "9":3, "7":2, "1":1}}
  当然这种方法的空间复杂度是 o(n^2)
  :param strs: 给定的数组中存放有多个字符串['*','3','*','5','10','9','7','1','*']
  :param str1: 第一个字符串, '*'
  :param str2: 第二个字符串, '9'
  :return: 如果其中给定的一个字符串不在数组 strs 中,那么返回-1,否则返回两个字符串之间的最小间距
  '''
  if str1 not in strs or str2 not in strs:
   return -1
  if str1 == str2:
   return 0

  def create_hash(strs): # 创建 hash 的过程并不在查询里
   strs_set = list(set(strs))
   dist_hash = {}
   for i in xrange(0, len(strs_set)):
    temp = {}
    for j in xrange(0, len(strs_set)):
     if strs_set[i] != strs_set[j]:
      dist = min_distance_1(strs, strs_set[i], strs_set[j])
      temp[strs_set[j]] = dist
    dist_hash[strs_set[i]] = temp
   return dist_hash

  return create_hash(strs)[str1][str2]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
深入解析Python中的集合类型操作符
Aug 19 Python
python验证码识别的实例详解
Sep 09 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
python使用Tesseract库识别验证
Mar 21 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
django删除表重建的实现方法
Aug 28 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
python常用数据重复项处理方法
Nov 22 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
Python restful框架接口开发实现
Apr 13 Python
Python设计密码强度校验程序
Jul 30 Python
利用Python实现模拟登录知乎
May 25 Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 #Python
详解django中使用定时任务的方法
Sep 27 #Python
Python高级特性切片(Slice)操作详解
Sep 27 #Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 #Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 #Python
APIStar:一个专为Python3设计的API框架
Sep 26 #Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 #Python
You might like
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
php中cookie的作用域
2008/03/27 PHP
PHP与MySQL开发的8个技巧小结
2010/12/17 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
JS控制表格隔行变色
2006/06/26 Javascript
JS 遮照层实现代码
2010/03/31 Javascript
有关javascript的性能优化 (repaint和reflow)
2013/04/12 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
2016/01/27 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
Python实现类继承实例
2014/07/04 Python
python中正则表达式的使用详解
2014/10/17 Python
Python提取网页中超链接的方法
2016/09/18 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
python3 求约数的实例
2019/12/05 Python
python中二分查找法的实现方法
2020/12/06 Python
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
青年志愿者事迹材料
2014/02/07 职场文书
绩效管理实施方案
2014/03/19 职场文书
捐款感谢信
2015/01/20 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书
Python实现的扫码工具居然这么好用!
2021/06/07 Python
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
Python加密技术之RSA加密解密的实现
2022/04/08 Python