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使用MONGODB入门实例
May 11 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
Python登录注册验证功能实现
Jun 18 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
python爬取酷狗音乐排行榜
Feb 20 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
Aug 05 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
Python使用configparser读取ini配置文件
May 25 Python
python3中for循环踩过的坑记录
Dec 14 Python
python定义具名元组实例操作
Feb 28 Python
Python天气语音播报小助手
Sep 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
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
js实现数字滚动特效
2019/12/16 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
Python中文件遍历的两种方法
2014/06/16 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python本地与全局命名空间用法实例
2015/06/16 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
python实现贪吃蛇双人大战
2020/04/18 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
社区助残日活动总结
2014/08/29 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
自查自纠整改报告
2014/11/06 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书