Python实现针对给定字符串寻找最长非重复子串的方法


Posted in Python onApril 21, 2018

本文实例讲述了Python实现针对给定字符串寻找最长非重复子串的方法。分享给大家供大家参考,具体如下:

问题:

给定一个字符串,寻找其中最长的重复子序列,如果字符串是单个字符组成的话如“aaaaaaaaaaaaa”那么满足要求的输出就是a

思路:

这里的思路有两种是我能想到的

(1)从头开始遍历字符串,设置标志位,在往后走的过程中当发现和之前标志位重合的时候就回头检查一下这个新出现的子串是否跟前面字符串或者前面字符串的子串相同,相同则记录该子串并计数加1,直至处理完毕

(2)利用滑窗切片的机制,生成所有的切片接下来统计和处理,主要利用到了两次排序的功能

本文采用的是第二种方法,下面是具体实现:

#!usr/bin/env python
#encoding:utf-8
'''''
__Author__:沂水寒城
功能:给定一个字符串,寻找最长重复子串
'''
from collections import Counter
def slice_window(one_str,w=1):
  '''''
  滑窗函数
  '''
  res_list=[]
  for i in range(0,len(one_str)-w+1):
    res_list.append(one_str[i:i+w])
  return res_list
def main_func(one_str):
  '''''
  主函数
  '''
  all_sub=[]
  for i in range(1,len(one_str)):
    all_sub+=slice_window(one_str,i)
  res_dict={}
  #print Counter(all_sub)
  threshold=Counter(all_sub).most_common(1)[0][1]
  slice_w=Counter(all_sub).most_common(1)[0][0]
  for one in all_sub:
    if one in res_dict:
      res_dict[one]+=1
    else:
      res_dict[one]=1
  sorted_list=sorted(res_dict.items(), key=lambda e:e[1], reverse=True)
  tmp_list=[one for one in sorted_list if one[1]>=threshold]
  tmp_list.sort(lambda x,y:cmp(len(x[0]),len(y[0])),reverse=True)
  #print tmp_list
  print tmp_list[0][0]
if __name__ == '__main__':
  print "三水点靠木测试结果:"
  one_str='abcabcd'
  two_str='abcabcabd'
  three_str='bbbbbbb'
  main_func(one_str)
  main_func(two_str)
  main_func(three_str)

结果如下:

Python实现针对给定字符串寻找最长非重复子串的方法

更多关于Python相关内容可查看本站专题:《Python字符串操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
深入解析Python中的urllib2模块
Nov 13 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
[原创]使用豆瓣提供的国内pypi源
Jul 02 Python
Python中按值来获取指定的键
Mar 04 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
Python3.4解释器用法简单示例
Mar 22 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
django中cookiecutter的使用教程
Dec 03 Python
详解python3 GUI刷屏器(附源码)
Feb 18 Python
Python 实现一行输入多个值的方法
Apr 21 #Python
Python实现接受任意个数参数的函数方法
Apr 21 #Python
深入分析python数据挖掘 Json结构分析
Apr 21 #Python
Python编程中NotImplementedError的使用方法
Apr 21 #Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 #Python
python 限制函数调用次数的实例讲解
Apr 21 #Python
python装饰器-限制函数调用次数的方法(10s调用一次)
Apr 21 #Python
You might like
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
wxpython学习笔记(推荐查看)
2014/06/09 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
python 拼接文件路径的方法
2018/10/23 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
python 将Excel转Word的示例
2021/03/02 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
植物选择:Botanic Choice
2017/02/15 全球购物
教师申诉制度
2014/01/29 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
六五普法宣传标语
2014/10/06 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书