当前位置: 首页 > 编程笔记 >

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

万俟渊
2023-03-14
本文向大家介绍Python实现针对给定字符串寻找最长非重复子串的方法,包括了Python实现针对给定字符串寻找最长非重复子串的方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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简单实现查找一个字符串中最长不重复子串的方法。分享给大家供大家参考,具体如下: 刚结束的一个笔试题,很简单,不多说简单贴一下具体的实现: 结果如下: 120135435最长非重复子串为:201354

  • 我如何在O(N**2)个时间内完成它?

  • 具有任意字符串的,如 我是否可以找到由空格分隔的重复子字符串(编辑)?在这种情况下,它将是“你好”、“我是”和“字符串”。 我一直在想这个问题有一段时间了,但我仍然找不到任何真正的解决办法。我也读过一些关于这个主题的文章,并偶然发现了后缀树,但即使我需要找到每一个重复,例如重复数大于2,这能帮助我吗? 如果是这样,是否有一些python库可以处理后缀树并对其执行操作? 编辑:很抱歉我说得不够清楚。

  • 本文向大家介绍Python实现统计给定字符串中重复模式最高子串功能示例,包括了Python实现统计给定字符串中重复模式最高子串功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现统计给定字符串中重复模式最高子串功能。分享给大家供大家参考,具体如下: 给定一个字符串,如何得到其中重复模式最高的子字符串,我采用的方法是使用滑窗机制,对给定的字符串切分,窗口的大小从1增加到字

  • 题目描述 输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。 解题思路 // java public int longestSubStringWithoutDuplication(String str) { int curLen = 0; int maxLen = 0;