Python-VBA编程500例-022(入门级)

最长AB子串(Longest AB Alternating Substring)(或称为最长XY出现次数相同的子字符串)这个问题看似是一个比较抽象的编程问题,但在实际应用场景中,它可以用来解决一系列涉及平衡性和重复模式的实际问题。常见应用场景有:

1、DNA或RNA序列分析:在生物信息学中,最长AB子串问题可以用于分析DNA或RNA序列中特定碱基对的平衡性。例如,在寻找可能的蛋白质编码区域时,需要分析序列中碱基对的出现次数和平衡性。

2、信号处理:在信号处理领域,特别是当涉及到具有周期性或重复性模式的信号时,最长AB子串算法可以用于识别和分析这些模式。

3、网络通信协议:在网络通信中,特定的数据帧或数据包可能需要满足一定的格式要求,包括某些字段的出现次数和顺序。最长AB子串算法可以用于验证这些要求是否得到满足。

4、编码与解码:在一些编码和解码算法中,可能需要确保编码后的字符串中特定字符或字符组合的出现次数保持平衡。最长AB子串算法可以用于验证和优化这些编码策略。

5、文本分析:在自然语言处理或文本挖掘中,最长AB子串问题可能用于分析文本中特定单词或短语的出现频率和分布,从而揭示文本的结构或主题。

6、数据压缩:在数据压缩算法中,寻找最长AB子串可以帮助识别重复的模式,从而更有效地压缩数据。

7、编程竞赛与算法训练:这个问题也是算法竞赛和编程训练中常见的题目,用于检验选手的算法设计和优化能力。

总的来说,最长AB子串问题虽然看似简单,但在实际应用中具有广泛的用途。它涉及到模式识别、平衡性分析、优化等多个方面,对于解决一系列实际问题具有重要意义。

 

1、最长AB子串:
1-1、Python:
# 1.问题描述:
# 给出一个只由字母X和Y组成的字符串str1,找一个最长的子串,要求这个子串里面X和Y的数目相等,并输出该子串的长度.
# 2.问题示例:
# 输入str1= "XYXXXYYYX",输出8.
# 3.代码实现:
class Solution:
    # 参数str1: 待查字符串
    # 返回值answer: 整数,即最大字符串的长度
    def get_substring_longest(self, str1):
        # 初始化一个变量answer,用于记录最长子串的长度,初始值为0
        answer = 0
        # 初始化一个列表arr1,长度为str1的长度,所有元素初始值为0
        arr1 = [0] * len(str1)
        # 初始化一个空字典sets,用于存储差值与对应位置的关系
        sets = {}
        # 判断str1的第一个字符是否为'X'
        if str1[0] == 'X':
            # 如果是'X',则arr1的第一个元素设为1,sets中存储1对应的位置为0
            arr1[0], sets[1] = 1, 0
        else:
            # 如果不是'X',则arr1的第一个元素设为-1,sets中存储-1对应的位置为0
            arr1[0], sets[-1] = -1, 0
        # 遍历str1的字符,从第二个字符开始(索引为1)
        for i in range(1, len(str1)):
            # 根据当前字符是'X'还是'Y',设置diff的值为1或-1
            diff = 1 if str1[i] == 'X' else -1
            # 更新arr1的当前位置的值,为前一个位置的值加上diff
            arr1[i] = arr1[i - 1] + diff
            # 如果arr1的当前位置的值为0,表示当前位置之前的'X'和'Y'数量相等
            if arr1[i] == 0:
                # 更新answer为当前位置加1,因为子串的起始位置到当前位置(包含当前位置)的长度是i+1
                answer = i + 1
                # 跳过当前循环的剩余部分,继续下一次循环
                continue
            # 如果arr1的当前位置的值在sets中已经存在
            if arr1[i] in sets:
                # 更新answer为当前答案与当前位置与sets中对应位置之差的较大值
                answer = max(answer, i - sets[arr1[i]])
            else:
                # 如果arr1的当前位置的值不在sets中,则将其加入sets,并记录位置
                sets[arr1[i]] = i
        # 返回最长子串的长度
        return answer
# 主函数
if __name__ == '__main__':
    # 定义一个字符串str1
    str1 = "XYXXXYYYX"
    # 实例化Solution类
    solution = Solution()
    # 打印字符串str1
    print("XY字符串:", str1)
    # 调用get_substring_longest方法,并打印最长XY出现次数相同的子字符串长度
    print("最长XY出现次数相同的子字符串长度:", solution.get_substring_longest(str1))
# 4.运行结果:
# XY字符串: XYXXXYYYX
# 最长XY出现次数相同的子字符串长度: 8
1-2、VBA:
Rem 自定义函数,功能:最长AB子串
Function GetSubstringLongest(str1 As String) As Integer
    Dim answer As Integer
    Dim arr1() As Integer
    Dim sets As Object
    Dim i As Integer
    Dim diff As Integer
    Dim key As Variant
      
    ' 初始化answer为0
    answer = 0
    ' 创建数组arr1并初始化为0
    ReDim arr1(1 To Len(str1))
    ' 初始化sets为Scripting.Dictionary对象,用于存储键值对
    Set sets = CreateObject("Scripting.Dictionary")
    ' 设置第一个字符的arr1值和sets中的键值对
    If left(str1, 1) = "X" Then
        arr1(1) = 1
        sets.Add 1, 1
    Else
        arr1(1) = -1
        sets.Add -1, 1
    End If
    ' 遍历字符串的每个字符
    For i = 2 To Len(str1)
        ' 根据当前字符设置diff的值
        diff = IIf(mid(str1, i, 1) = "X", 1, -1)
        ' 更新arr1的当前位置的值
        arr1(i) = arr1(i - 1) + diff
        ' 如果arr1的当前位置为0,则更新answer
        If arr1(i) = 0 Then
            answer = i
        End If
        ' 检查sets中是否已存在当前arr1的值
        If sets.Exists(arr1(i)) Then
            ' 更新answer为当前答案与当前位置与sets中对应位置之差的较大值
            answer = Application.WorksheetFunction.Max(answer, i - sets(arr1(i)))
        Else
            ' 如果arr1的当前值不在sets中,则将其加入sets
            sets.Add arr1(i), i
        End If
    Next i
    ' 返回最长子串的长度
    GetSubstringLongest = answer
End Function
Rem 执行程序,功能:调用自定义函数GetSubstringLongest,在立即窗口中输出结果
Sub TestRun()
    ' 声明一个变量 str1,类型为 String,用于存储待查字符串
    Dim str1 As String
    ' 声明一个变量 result,类型为 Integer,用于存储找到的最大子串长度
    Dim result As Integer
  
    ' 将给定的字符串 "XYXXXYYYX" 分配给 str1
    str1 = "XYXXXYYYX"
    ' 调用 GetSubstringLongest 函数,传入 str1,将返回的结果存储到 result 中
    result = GetSubstringLongest(str1)
    ' 使用 Debug.Print 语句打印相关信息,输出最长XY出现次数相同的子字符串长度
    Debug.Print "最长XY出现次数相同的子字符串长度:" & result
End Sub
'结果输出:
'最长XY出现次数相同的子字符串长度:8

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行TestRun程序,在立即窗口中输出结果。

2、相关文章:

2-1、Python-VBA编程500例-019-02(入门级) 

2-2、Python-VBA编程500例-020-01(入门级) 

2-3、Python-VBA编程500例-020-02(入门级)

2-4、Python-VBA编程500例-021(入门级)

Myelsa的Python算法之旅(高铁直达):https://myelsa1024.blog.csdn.net/article/details/136889623?spm=1001.2014.3001.5502
欢迎访问个人主页:非风V非雨-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/495558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Obsidian插件:增加目录栏 flating toc

一、插件介绍 增加目录栏 插件市场搜索 flating toc安装即可 二、使用 写文档时候可以看到左边默认出现目录 可以自己配置一些相关设置 最后也可以安装一下插件样式设置插件,自己按照自己喜好调整

怎么搭建一个蛋糕店微信小程序_打造你的专属蛋糕店微信小程序

甜蜜满溢,一键尽享——打造你的专属蛋糕店微信小程序 在这个快节奏的时代,我们总是在寻找一种简单、快捷的方式来满足自己的味蕾。想象一下,当你忙碌了一天,疲惫不堪,突然想吃上一口美味的蛋糕,却又不想费…

使用GPU加速FLUENT计算

1.软件配置 一台具有Nvidia显卡的电脑 确保电脑正确安装有显卡驱动 可通过cmd窗口输入“nvidia-smi”命令,若看到下述窗口则说明显卡驱动安装正确。 安装最佳适配的CUDA版本,也可安装低版本CUDA驱动。 同样可通过cmd窗口输入“nvidia-smi”命令&#x…

关于移动视频-无线图传产品中的录像-云端录像-录像计划等说明

关于4G执法记录仪-智能安全帽-布控球-4GDVR等4G/5G图传产品中的录像机制 录像通常可保存在如下三个地方, 1)前端设备,例如执法仪内部的TF卡、DVR里面的SD卡或者硬盘;需要通过USB接上位机/采集站导出,或者手工上传到平…

速成软件书:真的是神器吗?

那些声称几天能让你精通软件的书籍通常是几乎不可信的。学习任何一项技能都需要时间、耐心和实践,不能依靠几天的学习就能达到精通的水平。这样的书籍往往宣传夸大,吹嘘简单快速的学习方法,实际效果可能不令人满意。 要想真正掌握一项技能&am…

几款主流好用的markdown编辑器介绍

当然,以下是关于几款主流好用的 Markdown 编辑器介绍的博客分享: 几款主流好用的 Markdown 编辑器介绍 在写作、笔记、博客等文档编辑过程中,Markdown 已经成为了许多人的首选格式。为了更高效地编写 Markdown 文档,选择一款适合…

【功能实现】新年贺卡(蓝桥)

题目分析: 想要实现一个随机抽取功能 功能拆解:题目给了数组,我们采用生成随机数的方式,随机数作为数组的索引值访问数组的值。 并返回获取到的值,将获取到的值插入到页面中。 document.addEventListener(DOMConten…

TouchGFX之画布

一、画布渲染器 画布控件渲染器(Canvas Widget Renderer,以下简称CWR)是强大的多功能TouchGFX插件,在使用相对较小的存储空间的同时保持高性能,可提供平滑、抗锯齿效果良好的几何图形绘制。TouchGFX使用CWR可绘制复杂…

Redis命令-String命令

4.3 Redis命令-String命令 String类型,也就是字符串类型,是Redis中最简单的存储类型。 其value是字符串,不过根据字符串的格式不同,又可以分为3类: string:普通字符串int:整数类型&#xff0…

【正点原子FreeRTOS学习笔记】————(14)事件标志组

这里写目录标题 一、事件标志组简介(了解)二、事件标志组相关API函数介绍(熟悉)三、事件标志组实验(掌握) 一、事件标志组简介(了解) 事件标志位:用一个位,来…

香港高才通计划abc类的申请材料各不同,附官方续签攻略!

香港高才通计划abc类的申请材料各不同,附官方续签攻略! 作为香港“史上最快获批签证”,高才通计划受到内地精英的热烈欢迎,香港高才通于2022年12月28日开放申请,截至2023年12月31日,香港高才通计划已接获62…

如何应对Android面试官->Android中的类加载机制,手写热修复框架(上)

前言 本章主要介绍 Android 中的类加载机制和 Java 中的类加载机制有什么不同? ClassLoader Android 中的顶层抽象基类也是 java.lang.ClassLoader;可以进入 Android SDK 中提供的 ClassLoader 看一下 可以看到,这个 ClassLoader 是一个抽象…

短视频矩阵系统新的ui迭代上线

短视频矩阵系统是一个复杂的系统,需要保证其稳定性以确保用户的使用体验。以下是一些关键的方法和步骤来确保开发的系统稳定性: 1. **设计合理的架构**:架构的合理性对于系统的稳定性至关重要。系统应设计为可扩展的,并具有良好的…

【JavaWeb】Day17.前端工程化——Vue项目开发流程

Vue项目开发流程 上个文章展示了建立新的Vue项目并打开网页,今天展示项目是如何形成的,即项目的开发流程。 用VScode打开新建的项目 ,render函数创建了虚拟DOM元素,在app.vue中定义。 Vue的组件文件以 .vue结尾,每个组…

TLSR8258 MTU、DLE(PDU)

本文基于泰凌微TLSR8258 M1S1 demo。 1.DLE:LE Data Packet Length Extension 中文全称:低功耗蓝牙数据包长度扩展。 这是一个在2014年12月2日正式发布的bluetooth for BLE添加的新特性,以支持在LL Data PDU更长的数据,最大支持…

echarts 3D示例 echart, echarts-gl

echarts官网有很多的炫酷的3D模型 来尝试实现下&#xff0c;使用原本的柱状图或者折线图代码创建echarts示例,使用cdn的方式引入echarts <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewp…

共享WiFi贴码真能赚钱还只是骗局?

最近WiFi贴码的风真的很大&#xff0c;想做的人很多&#xff0c;那么自然怕被骗的人也比比皆是。WiFi贴码真的如大家所说很赚钱&#xff1f;本期就来解答一下WiFi贴码到底能不能挣钱以及它分析是不是骗局的套路。 什么是WiFi贴码&#xff1f; 这边我们从共享wifi的鼻祖微火那了…

PADS导出元器件的值,并且自动摆放在相对的位置上显示

PADS导出元器件的值&#xff0c;并且自动摆放在相对的位置上显示 1. pads 显示出器件信息 点击右键鼠标&#xff0c;点击选择元器件&#xff0c;鼠标框选全部器件 在器件上右击&#xff0c;点击特性 PS&#xff1a;操作的时候&#xff0c;需要保证 器件有相关值的参数存在…

docker在线安装centos7(windows版)

目录 1、docker本地安装2、拉取centos7镜像3、启动容器4、配置SSH以访问centos7 1、docker本地安装 windows安装docker比较简单&#xff0c;官网搜索有个docker desktop装上就完事。 2、拉取centos7镜像 可以登录到docker hub上拉&#xff0c;也可以搜出来对应的centos7镜像…

前端学习<二>CSS基础——06-CSS盒模型详解

盒子模型 前言 盒子模型&#xff0c;英文即box model。无论是div、span、还是a都是盒子。 但是&#xff0c;图片、表单元素一律看作是文本&#xff0c;它们并不是盒子。这个很好理解&#xff0c;比如说&#xff0c;一张图片里并不能放东西&#xff0c;它自己就是自己的内容。…