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获取远程图片大小和尺寸的方法
Mar 26 Python
python中的闭包函数
Feb 09 Python
Python数据处理numpy.median的实例讲解
Apr 02 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
python实现简单加密解密机制
Mar 19 Python
使用python接入微信聊天机器人
Mar 31 Python
Python实现的统计文章单词次数功能示例
Jul 08 Python
Python2与Python3的区别点整理
Dec 12 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
Jan 09 Python
Python3标准库之threading进程中管理并发操作方法
Mar 30 Python
Python通过字典映射函数实现switch
Nov 06 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
8个必备的PHP功能实例代码
2013/10/27 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
js一组验证函数
2008/12/20 Javascript
HTML代码中标签的全部属性 中文注释说明
2009/03/26 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
JS判定是否原生方法
2013/07/22 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
ansible作为python模块库使用的方法实例
2017/01/17 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
keras中的History对象用法
2020/06/19 Python
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
物流管理毕业生自荐信
2013/10/24 职场文书
4s客服专员岗位职责
2013/12/01 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
大学生创业项目方案
2014/03/08 职场文书
初中英语演讲稿
2014/04/29 职场文书
通知函格式范文
2015/04/27 职场文书
使用pytorch实现线性回归
2021/04/11 Python