每日一题——重复的子字符串

news2025/1/22 16:50:24

每日一题

重复的子字符串

题目链接

在这里插入图片描述

注:本题的题解基本建立在KMP算法之上,对KMP算法不太了解的小伙伴可以参考这篇文章KMP算法及其改进图文详解

方法一:移动匹配

  • 我们先来看几个可以由一个字串重复多次构成的主字符串:“aaa”,“ababab”,“abcabc”

  • 可以发现满足条件主串的两个规律:

    • 一定可以在其前半部分和后半部分找到相等的子串,如上面三个例子的子串“a”,子串“ab”,子串“abc”
    • 交换前半部分和后半部分都相等的子串,主串仍然不变。
  • 由此可以得到,如果我们将主串复制一份,再将这两个相同的串拼到一起,并去头去尾(防止查找的过程中找到原来的串和复制后的串),如果能在新串中找到和主串相等的子串,那就说明这个主串就可以由它的一个子串重复构成

    • 例如字符串abcabc

      在这里插入图片描述

实现代码

//获得Next数组
void GetNext(char *s,int *Next)
{
    int len = strlen(s);
    Next[0] = -1;
    int i = 0;
    int k = -1;
    while(i < len - 1)
    {
        if(k == -1 || s[i] == s[k])
        {
            k++;
            i++;
            if(s[i] == s[k])
                Next[i] = Next[k];
            else
                Next[i] = k;
        }
        else
            k = Next[k];
    }
}
//判断是否可以在字符串s1中找到串s2
bool KMP(char *s1, char *s2, int *Next)     //s1为主串,s2为从串
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int i = 0, j = 0;
    while(i < len1 && j < len2)
    {
        if(s1[i] == s2[j])
        {
            i++;
            j++;
        }
        else if(j != 0)
        {
            j = Next[j];
            if(j == -1)
                j = 0;
        }
        else
            i++;
            
    }
    if(j >= len2)
        return true;
    else
        return false;
}
bool repeatedSubstringPattern(char * s){
    int i,j;
    int len = strlen(s);
    char *str = (char *)malloc(sizeof(char) * 2 * len + 1);
    int *Next = (int *)malloc(sizeof(int) * len);
    GetNext(s,Next);	//获得Next数组
    //将串s和其复制串合并到str中
    for(i = 0; i < len; i++)
        str[i] = s[i];
    j = i;
    for(i = 0; i < len; i++)
        str[j + i] = s[i];
    str[2 * len] = '\0';
    //去尾
    str[2 * len - 1] = '\0';
    return KMP(str + 1,s,Next);		//str+1相当于去头
}

方法二:KMP

  • 我们知道,KMP算法中,有Next数组保存了每个字符之前的子串的最长相等前后缀长度,那么最长相等前后缀长度和最小的重复子串有什么关系呢?
  • 直接下结论:
    • 如果一个字符串是由重复的子串构成,那么最长相等前后缀不包含的子串就是最小的重复子串
    • 如果一个字符串没有相等前后缀,那么这个字符串一定不能由重复子串构成
      • 由于本篇Next数组记录的是每个字符之前的子串的最长相等前后缀长度,因此为了判断该字符串是否具有相等的前后缀,需要在字符串的末尾再添加一个字符(随便什么字符都可以),这样,如果字符串没有相等的前后缀,那么Next[len - 1] = 0(len为Next数组大小)
    • 字符串的最大相等前后缀长度为Next[len - 1],由第一个结论可得,最小重复子串为len - next[len - 1],若len % (len - next[len - 1]) == 0 ,就说明字符串长度可以整除最小重复子串的长度,即可说明该字符串可以由重复子串构成。

实现代码

//求Next数组
void GetNext(char *s,int *Next)
{
    int len = strlen(s);
    Next[0] = -1;
    int i = 0;
    int k = -1;
    while(i < len - 1)
    {
        if(k == -1 || s[i] == s[k])
        {
            k++;
            i++;
            Next[i] = k;
        }
        else
            k = Next[k];
    }
}

bool repeatSubstring(char* str ) {
    int len = strlen(str);
    
    //创建一个比原字符串大两个字符(一个随机字符,和空字符)的字符数组
    char* s = (char*)malloc(sizeof(char) * (len + 2));		
    
    //将原字符串拷贝到新字符串中,并添加随机字符和空字符
    strcpy(s,str);
    s[len] = 'a';
    s[len + 1] = '\0';
    
    //申请Next数组的内存
    int *Next = (int *)malloc(sizeof(int) * (len + 1));
    
    //得到Next数组
    GetNext(s,Next);
    
    //如果该字符串由相等前后缀,并且字符串长度可以整除最小重复子串,那么就说明这个字符串可以由重复子串构成
    //这里的len之所以不要减一,是因为Next的大小为len+1,我们要得到的就是Next的最后一个值,即Next[len]
    if(Next[len] != 0 && len % (len - Next[len]) == 0)
        return true;
    
    return false;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python人脸识别步骤

简介 Python是一种优秀的编程语言&#xff0c;它广泛应用于人工智能、数据科学、Web应用程序开发等领域。其中&#xff0c;人脸识别是Python应用程序中的重要一环。 本文将介绍Python人脸识别的具体步骤&#xff0c;希望对初学者有所帮助。 Python人脸识别步骤 安装必要的库…

销售管理全面指南:职能、流程、目标和工具

销售管理是优化公司销售队伍的过程&#xff0c;以有效利用现有资源来完成交易。对于任何依靠销售来推动收入的企业来说&#xff0c;这是绝对必要的。 销售管理可以细分为三个主要领域&#xff1a;销售运营、销售策略和销售分析。 根据美国营销协会&#xff08;AMA&#xff…

使用腾讯云短信服务实现Spring Boot短信发送

发送短信 01 注册微信公众号02 注册腾讯云账号03 创建签名和模板第一步 创建签名第二部 创建模板 04 发送短信 01 注册微信公众号 在百度中寻找微信公众平台&#xff0c;并在进入官网后注册。在账号注册过程中&#xff0c;需选择订阅号(个人)。注册成功后&#xff0c;请保存账…

我的浙大MEM提前批面试全流程重点信息梳理

浙江大学MEM已上岸&#xff0c;目前在读&#xff0c;给大家分享下我的备考经验&#xff0c;希望可以帮助到大家。 在确定自己的目标院校后收集相关信息是非常重要的&#xff0c;比如今年计划招多少学生&#xff0c;往年上岸都需要多少分&#xff0c;学费等情况&#xff0c;招考…

Kyligence x 集简云|无代码集成数百款应用,轻松打造数据产品

一站式指标平台 Kyligence Zen 现已支持对接集简云平台&#xff0c;企业无需繁琐的开发工作&#xff0c;即可无代码集成数百款应用&#xff0c;打破数据孤岛、统一数据口径&#xff0c;帮助企业实现数据的协作和分享&#xff0c;轻松进行数据分析、构建数据产品&#xff0c;助力…

腾讯董志强出席全国信安标委“标准周”:数字化转型需要高安全等级架构

2023年5月29日至6月1日&#xff0c;全国信息安全标准化技术委员会&#xff08;以下简称“信安标委”&#xff09;2023年第一次“标准周”活动在云南昆明举行。此次活动聚集了全国顶级的网络安全标准专家、学者和业界领袖&#xff0c;共同探讨网络安全标准领域的前沿议题和最佳实…

c语言函数返回值的几种方式,入参方式回传数据

背景 在正常使用过程中&#xff0c;突然发现有用二级指针传递地址&#xff0c;我想没必要用二级指针&#xff0c;实际目的是函数入参的参数&#xff0c;也是函数出参的参数 #mermaid-svg-ylOpK9fmaLgdD9YO {font-family:"trebuchet ms",verdana,arial,sans-serif;fo…

火山引擎A/B测试:MAB智能调优实验,企业活动效果提升新利器

618临近&#xff0c;各大电商APP的预热活动已然拉开序幕。对企业而言&#xff0c;一场活动从策划到上线&#xff0c;中间经过效果验证&#xff0c;其业务成本很高。一个好的活动创意从策划、开发、到最终发布&#xff0c;至少会经历几周实践&#xff0c;如果中间还经历A/B实验的…

三肽-33/Preventhelia(Diaminopropionoyl Tripeptide-33)

紫外线是一种电磁波&#xff0c;波长小于可见光&#xff0c;大部分地球表面的紫外线来自太阳&#xff0c;紫外线是伤害性光线的一种&#xff0c;经由皮肤吸收&#xff0c;会破坏DNA&#xff0c;使细胞会死亡或凋零从而产生皱纹、晒伤、等一系列不良反应。 作用机理---- Preven…

深入理解设计原则之依赖反转原则(DIP)

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 DIP&#xff1a;依赖反转原则 系列文章目录1、依赖反转原则的定义和解读2、稳定的抽象层3、依赖倒置原则和控制反转、依赖注入的联系小结 1、依赖反转原则的定义和解读 SOIL…

Linux零拷贝

零拷贝&#xff08;Zero-copy&#xff09;是一种优化技术&#xff0c;用于减少数据在内核空间和用户空间之间的拷贝次数&#xff0c;提高数据传输的效率和性能。它通过最小化数据的复制操作&#xff0c;将数据直接从源位置传输到目标位置&#xff0c;而不需要额外的数据拷贝。 …

微信小程序 构建npm报错: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogramRoot` 目录内,

构建npm时报错 几个解决方案&#xff1a; 1、没有初始化项目 可以看这篇博客&#xff1a;微信小程序构建npm&#xff08;js和ts 2、ts版本下记得修改删除project.config.json中setting字段下的一些内容 需要加或修改 "packNpmManually": true, "packNpmRe…

短视频矩阵系统软件源码---技术部署创建

矩阵系统源码主要有三种框架&#xff1a;Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架&#xff0c;提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架&#xff0c;用于将数据模型、Web应用程序的用户界面和控制器逻…

实战助力未来|“饶派杯”XCTF车联网安全挑战赛圆满收官!

2023年5月31日&#xff0c;“饶派杯”XCTF车联网安全挑战赛于江西省上饶市圆满落幕。本次大赛由江西省委网信办、江西省工信厅、上饶市人民政府主办&#xff0c;旨在深入贯彻落实国家网络强国和交通强国战略部署&#xff0c;推动智能网联汽车技术与产业发展、加快该领域人才培养…

【Linux】基于环形队列的生产者消费者模型

文章目录 基于环形队列的生产消费模型生产者和消费者的关注点申请和释放资源的问题规则 RingQueue.hpp单生产者单消费者的生产者消费者模型:信号量保护环形队列的原理多生产者多消费者模型计算任务处理RingQueue.hppTask.hppRingQueue.cc 基于环形队列的生产消费模型 环形队列…

安装pytourch gpu并测试

输入nvidia-smi命令查看cuda版本号, 系统的CUDA版本决定了系统最高可以支持什么版本的cudatoolkit&#xff0c;它是向下兼容的, 可以装低版本但是不能装高版本。 更新下conda&#xff0c;用管理员打开cmd conda update -n base -c defaults conda 安装CUDATookit 使用以下命令…

8 指数族分布【手写+Xmind笔记】

文章目录 8 指数族分布【手写Xmind笔记】8.1 Xmind笔记8.2 手写证明 8 指数族分布【手写Xmind笔记】 8.1 Xmind笔记 8.2 手写证明

第十二篇、基于Arduino uno,获取多个按键的输入信号(滤波消抖)——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;当按下按键的时候&#xff0c;按一次会打印一次按键被按下&#xff0c;并且打印是哪个按键被按下。如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;虽然每个型号的按键形态各异&a…

Linux---用户的权限

专栏&#xff1a;Linux 个人主页&#xff1a;HaiFan. 本章为大家带来用户的权限的讲解 用户的权限 Linux权限的概念权限的三类对象权限的三种类型权限设置chmod/chown/chgrp更改权限chmodchownchgrp umask目录的权限粘滞位 Linux权限的概念 Linux下有两种用户&#xff1a;超级…

安科瑞应急照明的环境适用性

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;论述消防应急照明和疏散指示系统在实际工程应用过程中系统产品选型、设置及维护环节普遍存在的问题&#xff0c;并提出相应的解决对策。 关键词&#xff1a;应急照明疏散指示产品选型环境适用性灯具…