Python实现针对给定字符串寻找最长非重复子串的方法
Python  /  管理员 发布于 7年前   144
本文实例讲述了Python实现针对给定字符串寻找最长非重复子串的方法。分享给大家供大家参考,具体如下:
问题:
给定一个字符串,寻找其中最长的重复子序列,如果字符串是单个字符组成的话如“aaaaaaaaaaaaa”那么满足要求的输出就是a
思路:
这里的思路有两种是我能想到的
(1)从头开始遍历字符串,设置标志位,在往后走的过程中当发现和之前标志位重合的时候就回头检查一下这个新出现的子串是否跟前面字符串或者前面字符串的子串相同,相同则记录该子串并计数加1,直至处理完毕
(2)利用滑窗切片的机制,生成所有的切片接下来统计和处理,主要利用到了两次排序的功能
本文采用的是第二种方法,下面是具体实现:
#!usr/bin/env python#encoding:utf-8'''''__Author__:沂水寒城功能:给定一个字符串,寻找最长重复子串'''from collections import Counterdef 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_listdef 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程序设计有所帮助。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号