使用Python算法实现从字符串中提取重复子串

 更新时间:2025年10月22日 09:37:04   作者:东方佑  
在文本处理和数据分析中,经常需要从字符串中提取重复出现的子串,本文将解析一个高效的Python算法,用于从给定字符串中提取长度超过3的重复子串,需要的朋友可以参考下

算法概述

该算法包含两个核心函数:

  • replace_text() - 预处理字符串,替换低频字符
  • compute_sub_string_list() - 提取重复子串

1. 预处理函数:replace_text()

def replace_text(copy_text):
    replace_char = ""
    # 统计字符频率
    for char, count in Counter(list(copy_text)).items():
        if count == 1:  # 只出现一次的字符
            if replace_char == "":
                replace_char = char  # 选择第一个低频字符作为替换字符
            else:
                # 用替换字符替换其他低频字符
                copy_text = copy_text.replace(char, replace_char)
    
    if replace_char != "":
        # 分割字符串并筛选长度>3的子串
        return [sub for sub, _ in Counter(copy_text.split(replace_char)).items() 
                if len(sub) > 3]
    else:
        return [copy_text]  # 没有低频字符时返回整个字符串

功能说明

  • 找出所有只出现一次的字符
  • 使用第一个低频字符替换其他低频字符
  • 用替换字符分割字符串
  • 返回长度超过3的子串列表

2. 主处理函数:compute_sub_string_list()

def compute_sub_string_list(text1):
    text_list = replace_text(text1)  # 预处理
    new_text_list = []

    for one_text in text_list:
        if len(one_text) == 4:
            # 处理长度为4的子串
            if one_text in new_text_list:
                continue
            if text1.count(one_text) > 1:
                new_text_list.append(one_text)
        else:
            # 处理长度>4的子串
            max_count = 0
            max_str = ""
            while len(one_text) > 4:
                sub_str = one_text[:3]
                up_str_count = 0
                up_str = ""
                
                # 扩展子串并检查重复性
                for char in one_text[3:]:
                    sub_str += char
                    if sub_str in new_text_list:
                        continue
                    str_count = text1.count(sub_str)
                    if str_count > 1:
                        if up_str_count <= str_count:
                            up_str_count = str_count
                            up_str = sub_str
                    else:
                        break  # 停止扩展
                
                # 更新最佳子串
                if up_str:
                    if up_str_count > max_count:
                        max_count = up_str_count
                        max_str = up_str
                
                # 滑动窗口
                one_text = one_text[1:]
            
            if max_str:
                new_text_list.append(max_str)
    
    return new_text_list

功能说明

  • 对预处理后的每个子串进行处理
  • 对于长度为4的子串直接检查重复性
  • 对于更长子串使用滑动窗口 技术:
    1. 从3字符前缀开始扩展
    2. 记录出现次数最多的有效子串
    3. 滑动窗口继续查找
  • 返回所有符合条件的重复子串

算法优势

  1. 高效预处理:通过替换低频字符优化后续处理
  2. 智能子串扩展:动态扩展子串直到不再重复
  3. 滑动窗口 技术:高效遍历所有可能子串
  4. 频率优先:优先选择出现次数最多的子串

使用示例

if __name__ == '__main__':
    text = "abracadabraabracadabra"
    result = compute_sub_string_list(text)
    print("重复子串:", result)
    # 输出: ['abra', 'racad', 'acada', 'cadab', 'adabr']

应用场景

  • 文本模式识别
  • DNA序列分析
  • 代码重复检测
  • 自然语言处理中的短语提取
  • 数据压缩算法

这个算法通过巧妙的预处理和滑动窗口 技术,高效地从字符串中提取有意义的重复模式,特别适合处理包含重复模式的长文本数据。

def replace_text(copy_text):
    replace_text = ""
    for i in Counter(list(copy_text)).items():
        if i[1] == 1:
            if replace_text == "":
                replace_text = i[0]
            else:
                copy_text = copy_text.replace(i[0], replace_text)
    if replace_text != "":

        return [i[0] for i in Counter(copy_text.split(replace_text)).items() if len(i[0]) > 3]
    else:
        return [copy_text]


def compute_sub_string_list(text1):
    copy_text = text1
    text_list = replace_text(copy_text)

    new_text_list = []

    for one_text in text_list:
        if len(one_text) == 4:
            if one_text in new_text_list:
                continue
            if text1.count(one_text) > 1:
                new_text_list.append(one_text)
        else:
            max_count = 0
            max_str = ""
            while True:

                sub_str = one_text[:3]
                up_str_count = 0
                up_str = ""

                for s in one_text[3:]:
                    sub_str += s
                    if sub_str in new_text_list:
                        continue
                    str_count = text1.count(sub_str)
                    if str_count > 1:
                        if up_str_count <= str_count:
                            up_str_count = str_count
                            up_str = sub_str
                    else:
                        break
                if up_str:
                    if up_str_count > max_count:
                        max_count = up_str_count
                        max_str = up_str
                if len(one_text) > 4:

                    one_text = one_text[1:]
                else:
                    break
            new_text_list.append(max_str)
    return new_text_list


if __name__ == '__main__':
    print()

以上就是使用Python算法实现从字符串中提取重复子串的详细内容,更多关于Python算法字符串提取重复子串的资料请关注脚本之家其它相关文章!

相关文章

  • Flask实现定制日志并输出到文件

    Flask实现定制日志并输出到文件

    这篇文章主要为大家学习介绍了Flask如何实现定制日志并输出到文件,文中的示例代码简介易懂,感兴趣的小伙伴快跟随小编一起学习一下吧
    2023-07-07
  • pytorch简介

    pytorch简介

    Pytorch是torch的python版本,是由Facebook开源的神经网络框架,专门针对 GPU 加速的深度神经网络(DNN)编程。这篇文章给大家介绍pytorch的相关知识,感兴趣的朋友一起看看吧
    2020-11-11
  • Django项目中用JS实现加载子页面并传值的方法

    Django项目中用JS实现加载子页面并传值的方法

    今天小编就为大家分享一篇Django项目中用JS实现加载子页面并传值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python中解包操作的性能实测与最佳实践

    Python中解包操作的性能实测与最佳实践

    这篇文章主要为大家详细介绍了Python中解包操作的性能实测与最佳实践,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • 使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)

    使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)

    这篇文章主要介绍了使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 基于Python实现人像雪景小程序

    基于Python实现人像雪景小程序

    这篇文章主要介绍了通过Python实现的人像雪景小程序,小程序还会自动生成每一帧雪花飘落的图片,跟GIF动态雪花人像图,还不用自己录制视频看效果。感兴趣的可以跟随小编一起学习一下
    2021-12-12
  • Python使用DrissionPage实现自动化处理的简单入门指南

    Python使用DrissionPage实现自动化处理的简单入门指南

    在Python自动化领域,Selenium和Requests是两个常用工具,DrissionPage巧妙结合了两者优势,本文将带你从零开始,用10分钟掌握DrissionPage的核心用法,希望对大家有所帮助
    2026-01-01
  • numpy中np.sort返回索引的具体使用

    numpy中np.sort返回索引的具体使用

    本文主要介绍了使用numpy中np.sort函数返回索引的详细解释和使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Python中使用haystack实现django全文检索搜索引擎功能

    Python中使用haystack实现django全文检索搜索引擎功能

    django是python语言的一个web框架,功能强大。配合一些插件可为web网站很方便地添加搜索功能。下面通过本文给大家分享Python中使用haystack实现django全文检索搜索引擎功能,感兴趣的朋友一起看看吧
    2017-08-08
  • 使用Python的datetime库处理时间(RPA流程)

    使用Python的datetime库处理时间(RPA流程)

    datetime 是 Python 处理日期和时间的标准库。这篇文章主要介绍了使用Python的datetime库处理时间(RPA流程),需要的朋友可以参考下
    2019-11-11

最新评论