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中的hashlib和base64加密模块使用实例
Sep 02 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
django框架ModelForm组件用法详解
Dec 11 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
Python实现屏幕录制功能的代码
Mar 02 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
python 提高开发效率的5个小技巧
Oct 19 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 Python
Python开发简易五子棋小游戏
May 02 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
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
python分割和拼接字符串
2013/11/01 Python
python实现保存网页到本地示例
2014/03/16 Python
Python中内建函数的简单用法说明
2016/05/05 Python
python对象及面向对象技术详解
2016/07/19 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
Python中super函数用法实例分析
2019/03/18 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
生物化工专业个人自荐信
2013/09/26 职场文书
涉外文秘个人求职的自我评价
2013/10/07 职场文书
应届生高等护理求职信
2013/10/12 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
幸福家庭事迹材料
2014/02/03 职场文书
护理专业自荐信范文
2014/02/26 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
经营目标管理责任书
2014/07/25 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
办公室禁烟通知
2015/04/23 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书
个人收入证明格式
2015/06/24 职场文书
获奖感言怎么写
2015/07/31 职场文书
接收函
2019/04/22 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android