【数据结构与算法】力扣 459. 重复的子字符串

题目描述

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

输入: s = "aba"
输出: false

示例 3:

输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成

分析解答

重复的子串连接成父串?重复?repeat!重复的次数?父串的长度是子串的几倍就是重复几次!

/**
 * @param {string} s
 * @return {boolean}
 */
var repeatedSubstringPattern = function (s) {
    let subStr = ''
    for (let i = 0; i < s.length - 1; i++) {
        subStr += s[i]
        if (s === subStr.repeat(Math.floor(s.length / subStr.length))) {
            return true
        }
    }
    return false
};

思路拓展

移动匹配

既然是由重复的子串构成的,那么该字符串的首尾子串一定是相等的。所以:首 + 中间部分 + 尾 => 原字符串,那么,以此类推,尾 + 中间部分 + 首 => 原字符串。

所以我们的思路是:将两个字符串拼起来,找这个二倍的字符串是否含有原字符串(去掉首尾,防止两个原字符串的干扰)。

var repeatedSubstringPattern = function (s) {
    let str = s + s
    str = str.slice(1, str.length - 1)
    if (str.includes(s)) {
        return true
    }
    return false
};

KMP

next 数组是一个辅助数组,用来记录每个位置之前的最长相同前缀后缀的长度。通过计算next数组,就能得到字符串中最长的重复子串的长度。

主要逻辑如下:

  • 首先进行一些边界判断,如果字符串的长度为0,则返回false。
  • 然后定义了一个名为getNext的函数,用来计算next数组。这个函数通过使用双指针遍历字符串,根据不同的情况更新指针及next数组的值。具体来说:
    • 初始化一个next数组和一个指针j。
    • 将j的初始值0存入next数组中。
    • 从1到字符串的长度-1进行遍历,将指针j根据不同情况进行更新,并将更新后的j的值存入next数组中。
    • 最后返回next数组。
  • 接下来,调用getNext函数得到next数组。
  • 最后通过判断条件(最后位置的最长相同前后缀不能为 0 ;而且整个字符串的长度一定是最长相同前后缀的整数倍,也就是模为 0)来比较字符串长度是否是最长重复子串长度的倍数,如果是则返回true,否则返回false。

这段代码主要运用了KMP算法中的next数组计算来判断字符串是否由重复的子串组成。

/**
 * @param {string} s
 * @return {boolean}
 */
var repeatedSubstringPattern = function (s) {
    if (s.length === 0) {
        return false
    }
    const getNext = (s) => {
        let next = []
        let j = 0
        next.push(j)
        for (let i = 1; i < s.length; i++) {
            while (j > 0 && s[i] !== s[j]) {
                j = next[j - 1]
            }
            if (s[i] === s[j]) {
                j++
            }
            next.push(j)
        }
        return next
    }
    let next = getNext(s)
    if (next[next.length - 1] !== 0 && s.length % (s.length - next[next.length - 1]) === 0) {
        return true
    }
    return false
};
let s = "aba"
console.log(repeatedSubstringPattern(s))

详细讲讲 getNext 这个方法:

当进行字符串匹配时,我们需要找到一个最长的相同前缀后缀。这个相同前缀后缀的长度决定了我们在匹配失败时应该回退多少位。

getNext方法就是用来计算这个最长的相同前缀后缀的长度。它使用了双指针的方法来遍历字符串s,并根据不同的情况更新指针和next数组的值。

具体的实现逻辑如下:

  1. 首先,我们先定义一个数组next用来存储最长相同前缀后缀的长度。
  2. 接着,我们定义两个指针i和j,初始值都为0。指针i表示当前要计算最长相同前缀后缀的后缀的末尾位置,指针j表示当前已经求得的最长相同前缀后缀的长度。
  3. 先将指针j的初始值0存入next数组的第一个位置。
  4. 从字符串s的第二个字符开始,即i从1到s.length-1,进行遍历。
  5. 在遍历过程中,我们通过比较s[i]和s[j]的值,来更新指针j和next数组的值。具体的操作如下:
    • 如果s[i]和s[j]相等,说明当前的字符可以加入到已知的最长相同前缀后缀中,所以我们将指针j加1,并将j的值存入next数组的当前位置。
    • 否则,我们需要寻找更短的相同前缀后缀,所以我们将指针j回退到前一个位置,通过next[j-1]来获取更短的相同前缀后缀的长度。我们将比较s[i]和s[j-1]的值,直到找到一个相等的字符或者j回退到0为止。
      • 如果j回退到0仍然没有找到相等的字符,说明当前位置不存在相同的前缀后缀,所以将指针i加1,并将j的值0存入next数组的当前位置。
      • 如果找到了一个相等的字符s[i]和s[j-1],说明我们找到了一个更短的相同前缀后缀,所以我们将指针j加1,并将j的值存入next数组的当前位置。
  6. 遍历结束后,我们可以得到一个完整的next数组,其中的每个值都代表了相应位置的最长相同前缀后缀的长度。

通过getNext方法计算得到的next数组,可以用于优化字符串匹配算法,如KMP算法等。在本段代码中,我们利用next数组的最后一个值,来判断字符串是否是由重复的子串组成的。

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

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

相关文章

用过最佳的wordpress模板

西瓜红&#xff0c;作为一种充满活力和激情的颜色&#xff0c;总是能给人留下深刻的印象。当这种鲜艳的色彩与经典的设计元素相结合时&#xff0c;就能打造出一款既时尚又实用的WordPress企业模板。今天&#xff0c;我们向您隆重推荐这款西瓜红经典配色WordPress企业模板。 这…

HarmonyOS-Next开源三方库 MPChart:打造出色的图表体验

点击下载源码https://download.csdn.net/download/liuhaikang/89228765 简介 随着移动应用的不断发展&#xff0c;数据可视化成为提高用户体验和数据交流的重要手段之一。在 OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;应用开发中&#xff0c;一个强大而…

MIS微调SAM模型实时交互UI界面

前言 SAM模型的基本介绍可见SAM&#xff08;Segment Anything Model&#xff09;大模型使用--point prompt_sam大模型-CSDN博客 针对Meta团队去年发布的SAM大模型在医学图像分割领域表现性能较差的情况&#xff0c;笔者收集了一些MIS领域的数据集对SAM的架构进行fine tune&am…

架构师系列- 定时任务(四)- XXl-Job

XXL-JOB是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展&#xff0c;其中“XXL”是主要作者&#xff0c;大众点评许雪里名字的缩写 和ElasticJob的区别 相同点 E-Job和X-job都有普遍的用户基础和完整的技术文档&#xff0c;都…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.6-1.8

目录 第一门课&#xff1a;第二门课 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)…

某赛通电子文档安全管理系统 多处 SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

【智能算法】向日葵优化算法(SFO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2019年&#xff0c;GF Gomes等人受到自然界向日葵运动行为启发&#xff0c;提出了向日葵优化算法&#xff08;Sunflower Optimization, SFO&#xff09;。 2.算法原理 2.1算法思想 SFO模拟向日葵行…

Android某钉数据库的解密分析

声明 1 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 目的 1 解密app数据库&#xff0c;用数据库软件打开查看信息内容 入手…

C语言数据类型的介绍,类型的基本归类,整型在内存中的存储,原码、反码、补码,大小端等介绍

文章目录 前言一、数据类型的介绍类型的意义 1. 类型的基本归类&#xff08;1&#xff09;. 整型家族&#xff08;2&#xff09;. 浮点数家族&#xff08;3&#xff09;. 构造类型&#xff08;4&#xff09;. 指针类型&#xff08;5&#xff09;. 空类型 二、整型在内存中的存储…

【网络安全】安全事件管理处置 — 安全事件处置思路指导

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、处理DDOS事件 1.准备工作 2.预防工作 3.检测与分析 4.限制、消除 5.证据收集 二、处理恶意代码事件 1.准备 2.预防 3.检测与分析 4.限制 5.证据收集 6.消除与恢复 …

NodeJS基础知识

文章目录 **1. Node.js平台与架构****1.1 Node.js简介****1.2 事件循环&#xff08;Event Loop&#xff09;** **2. JavaScript基础知识****2.1 ECMAScript版本****2.2 变量、数据类型、运算符****2.3 函数****2.4 类与面向对象编程** **3. Node.js核心API****3.1 全局对象与内…

Linux下载及安装OpenSSL

文章目录 前言一、OpenSSL下载二、OpenSSL安装1.上传下载好的安装包到服务器2.解压3.切换目录4.配置config5.编译6.安装7.备份旧版本OpenSSL7.创建软链接8.添加OpenSSL动态链接库9.更新库缓存10.查看OpenSSL版本验证安装是否成功 前言 一般系统会自带有OpenSSL&#xff0c;我们…

OpenHarmony实战开发-媒体查询 (@ohos.mediaquery)

概述 媒体查询作为响应式设计的核心&#xff0c;在移动设备上应用十分广泛。媒体查询可根据不同设备类型或同设备不同状态修改应用的样式。媒体查询常用于下面两种场景&#xff1a; 针对设备和应用的属性信息&#xff08;比如显示区域、深浅色、分辨率&#xff09;&#xff0…

大数据第五天(操作hive的方式)

文章目录 操作hive的方式hive 存储位置hive 操作语法创建数据表的方式 操作hive的方式 hive 存储位置 hive 操作语法 创建数据表的方式 – 创建数据库 create database if not exists test我们创建数据库表的时候&#xff0c;hive是将我们的数据自动添加到数据表中&#xf…

Matlab|交直流系统潮流计算(含5种控制模式)

目录 1 主要内容 程序参考流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《交直流系统潮流计算及相互关联特性分析》&#xff0c;采用5种交直流潮流控制方式&#xff1a;1.定电流定电压 2.定电流定熄弧角 3.定功率定电压 4.定功率定熄弧角 5.定触发角…

C++进阶:多态

目录 一、多态的概念 二、多态的实现 1.多态的实现条件 2.虚函数 3.虚函数的重写(覆盖) 三、概念比较 四、抽象类 1.概念 2.接口继承与实现继承 一、多态的概念 在生活中我们通常会遇到以下的一个场景&#xff1a;领支付宝的红包。 明明都是同一个红包&#xff0c;不同…

Qt配置CMake出错

一个项目需要在mingw环境下编译Opencv源码&#xff0c;当我用Qt配置opencv的CMakeLists.txt时&#xff0c;出现了以下配置错误&#xff1a; 首先我根据下述博文介绍&#xff0c;手动配置了CMake&#xff0c;但仍不能解决问题。 Qt(MinGW版本)安装 - 夕西行 - 博客园 (cnblogs.…

鸿蒙(HarmonyOS)性能优化实战-Trace使用教程

概述 OpenHarmony的DFX子系统提供了为应用框架以及系统底座核心模块的性能打点能力&#xff0c;每一处打点即是一个Trace&#xff0c;其上附带了记录执行时间、运行时格式化数据、进程或线程信息等。开发者可以使用SmartPerf-Host调试工具对Trace进行解析&#xff0c;在其绘制…

人工智能如何提高公司效率的 5 种方法

人工智能是当今最热门的话题之一&#xff0c;但并不是每个人都了解其对商业的价值规模。由此可见&#xff0c;现有的AI技术可以将企业的生产力提升40%。 在机器学习的帮助下&#xff0c;Netflix 利用自动化个性化推荐每年赚取 10 亿美元。当公司使用人工智能时&#xff0c;34%…

线性代数:抽象向量空间

一、说明 有些函数系列极具线性代数的向量特征。这里谈及多项式构成函数的线性代数意义。问题是这个主题能展开多少内涵&#xff1f;请看本文的论述。 二、线性空间和向量 让我先问你一个简单的问题。什么是向量&#xff1f;为了方便起见&#xff0c;二维箭头从根本上说是平…