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 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
从Python的源码浅要剖析Python的内存管理
Apr 16 Python
python的else子句使用指南
Feb 27 Python
对numpy中数组元素的统一赋值实例
Apr 04 Python
python计算日期之间的放假日期
Jun 05 Python
对numpy数据写入文件的方法讲解
Jul 09 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
Jun 21 Python
python切片(获取一个子列表(数组))详解
Aug 09 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
Aug 12 Python
python的等深分箱实例
Nov 22 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 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
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
python使用循环实现批量创建文件夹示例
2014/03/25 Python
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python模拟三级菜单效果
2017/09/11 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
解决python 找不到module的问题
2020/02/12 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
keras打印loss对权重的导数方式
2020/06/10 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
2013年员工自我评价范文
2013/12/27 职场文书
大学班长的职责
2014/01/27 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
MySQL查询学习之基础查询操作
2021/05/08 MySQL