_8LeetCode代码随想录算法训练营第八天-C++字符串

news2024/11/26 12:22:00

_8LeetCode代码随想录算法训练营第八天-C++字符串

  • 28.实现strStr()
  • 459.重复的字字符串

28.实现 strStr()

KMP算法

什么是KMP

是由三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。

KMP有什么用

KMP主要应用在字符串匹配上。

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

所以如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。

什么是前后缀?

字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串

如,对于aabaabaaf
其前缀包括:
a
aa
aab
aaba
aabaa
aabaab
aabaaba
aabaabaa

后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串

如,对于aabaabaaf
其后缀包括:
f
af
aaf
baaf
abaaf
aabaaf
baabaaf
abaabaaf

最长相等前后缀?

对于aabaaf,求最长相等前后缀
a 理论上没有前缀没有后缀;因为它是首字母继尾字母;最长相等前后缀是0
aa 前缀a;后缀a;最长相等前后缀是1
aab 前缀有a,aa;后缀有b,ab;因此最长相等前后缀为0
aaba 前缀有a,aa,aab;后缀有a,ba,aba;因此最长相等前后缀为1
aabaa 前缀有a,aa,aab,aaba;后缀有a,aa,baa,abaa;因此最长相等前后缀为2
aabaaf 前缀有a,aa,aab,aaba,aabaa;后缀有f,af,aaf,baaf,abaaf;因此最长相等前后缀为0

由此得到前缀表:[0,1,0,1,2,0]

如何使用前缀表匹配?

如,对于aabaabaaf,寻找匹配的aabaaf
首先,找到了aabaab
aabaaf此时不匹配了
就找除掉f的aabaa的最长相等前后缀为2,意味着有个后缀aa,还有个与其相等的前缀aa。
然后对于字符串aabaaf,就从下标为2的位置继续开始找。

next数组

当遇到冲突之后,next数组告诉我们需要回退到哪里,从新开始寻找。next数组其实就是前缀表。

如何求得next数组:

  • 初始化next数组
  • 处理前后缀不相同的情况
  • 处理前后缀相同的情况
  • 更新next数组的值

完整实现代码

Emmm ,有点吃力,水平不够,得多学学

/*
 * @lc app=leetcode.cn id=28 lang=cpp
 *
 * [28] 找出字符串中第一个匹配项的下标
 */

// @lc code=start
class Solution {
public:
    //next是指向最长相等前后缀数组的指针,s字符串是指需要查找的字符串
    //s取引用是为了节省时间
    //这个步骤挺简单的,但是不太想得明白,所以后面再多想想
    //时间复杂度分析:n为文本串长度,m为模式串长度,此函数时间复杂度为m
    void getNext(int* next, string& s)
    {
        int j = 0;//j指向前缀末尾位置,也指向包括i之前的子串的最长相等前后缀的长度,初始化为0
        next[0] = 0;//初始化next[0]为0
        //i从1开始的原因是下标为0的元素其next[0]就是0,不用再计算
        for(int i = 1; i < s.size(); i++)
        {
            //处理前后缀不想同的情况
            //j要保证大于0,因为有j-1的操作
            while(j > 0 && s[i] != s[j])
                j = next[j-1];//找j的前一个回退位置
            //处理前后缀相同的情况
            if(s[i] == s[j])
                j++;
            next[i] = j;
        }
    }
    //时间复杂度分析:n为文本串长度,m为模式串长度,此函数时间复杂度为n
    //因此整个时间复杂度为m+n,感觉也不太懂
    int strStr(string haystack, string needle) {
        int next[needle.size()];
        getNext(next, needle);
        int j = 0;
        for(int i = 0; i < haystack.size(); i++)
        {
            while(j > 0 && haystack[i] != needle[j])
                j = next[j - 1];
            if(haystack[i] == needle[j])
                j++;
            if(j == needle.size())
                return (i - needle.size() + 1);
        }
        return -1;
    }
};
// @lc code=end

459.重复的子字符串

暴力解法

/*
 * @lc app=leetcode.cn id=459 lang=cpp
 *
 * [459] 重复的子字符串
 */

// @lc code=start
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        //暴力解决
        int length = s.size();//字符串的长度
        if(length < 2)
            return false;
        //模拟所有可能字串的长度
        for(int i = 1;i <= length/2; i++)
        {
            //串长度不是字串长度的倍数
            if(length % i != 0)
                continue;
            string temp = s.substr(0,i);
            string ans = "";
            for(int j = 0; j < length/i; j++)
                ans += temp;
            if(ans == s)
                return true;
        }
        return false;
    }
};
// @lc code=end

移动匹配

在这里插入图片描述

所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。

当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。

/*
 * @lc app=leetcode.cn id=459 lang=cpp
 *
 * [459] 重复的子字符串
 */

// @lc code=start
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        //移动匹配的方法
        string t = s + s;
        t.erase(t.begin());
        t.erase(t.end() - 1);
        if(t.find(s) != std::string::npos)//这个判断搜索结果的std::string::npos我还没见过
            return true;
        return false;
    }
};
// @lc code=end

KMP解法

重复字符串中的最小重复子串:

最长相等前后缀不包含的字串就是最小重复字串。

在这里插入图片描述

/*
 * @lc app=leetcode.cn id=459 lang=cpp
 *
 * [459] 重复的子字符串
 */

// @lc code=start
class Solution {
public:
    void getNext(int* next, string& s)
    {
        next[0] = 0;
        int j = 0;
        for(int i = 1; i < s.size(); i++)
        {
            while(j > 0 && s[i] != s[j])
                j = next[j - 1];
            if(s[i] == s[j])
                j++;
            next[i] = j;
        }
    }
    bool repeatedSubstringPattern(string s) {
        //KMP的方法---太牛啦
        int size = s.size();
        if(size == 0)
            return false;
        int next[size];
        getNext(next, s);
        //此处必须判断整个字符串的最大相等前后缀next[size - 1],如果next[size-1] == 0,就不成立
        //同时,如果size不能整除next[size-1]也不行
        if(next[size - 1] != 0 && size%(size - next[size - 1]) == 0)
            return true;
        return false;
    }
};
// @lc code=end

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

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

相关文章

SuperMap iClient3D for WebGL/Cesium端性能优化

目录 一、请求优化 1.1 多子域 1.1.1 scene.open()打开场景 1.1.2 加载地形 1.1.3 加载影像 1.1.4 加载S3M 1.1.5 加载MVT 1.2 批量请求 1.2.1 地形 1.2.2 影像 二、内存优化 2.1 根节点驻留内存 2.2 自动释放缓存 2.3 内存管理 三、图层优化 3.1 LOD 3.2 空间索引 3.3 控制图层…

企业文件泄漏防不胜防?安全防护3步走!

有一些管理者认为公司从未曾发生过数据泄密事件而心存侥幸&#xff0c;但数据泄密的代价&#xff0c;只需发生过一次&#xff0c;就足以给企业带来巨大的损害。 十四五规划中&#xff0c;“数据安全”和“网络安全”多次出现&#xff0c;加上《数据安全法》、《个人信息保护法》…

Linux下printf输出字符串的颜色

基本打印格式: printf("\033[字背景颜色;字体颜色m字符串\033[0m" ); printf("\033[41;32m字体背景是红色&#xff0c;字是绿色\033[0m\n"); 41是字背景颜色, 32是字体的颜色, 字体背景是红色&#xff0c;字是绿色是要输出的字符串. 后面的\033 ...\033[0m…

推荐系统毕业设计 协同过滤商品推荐系统设计与实现

文章目录1 简介2 常见推荐算法2.1 协同过滤2.2 分解矩阵2.3 聚类2.4 深度学习3 协同过滤原理4 系统设计4.1 示例代码(py)5 系统展示5.1 系统界面5.2 推荐效果6 最后1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是学长的毕设系列文章&#xff01; &#x1f525…

redis持久化方案介绍

Redis有两种持久化方案&#xff1a;1. RDB持久化 2. AOF持久化 1 RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&…

[附源码]Python计算机毕业设计高校实习管理平台系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

【自然语言处理】基于TextRank算法的文本摘要

基于TextRank算法的文本摘要文本摘要是自然语言处理&#xff08;NLP&#xff09;的应用之一&#xff0c;一定会对我们的生活产生巨大影响。随着数字媒体的发展和出版业的不断增长&#xff0c;谁还会有时间完整地浏览整篇文章、文档、书籍来决定它们是否有用呢&#xff1f; 利用…

数据结构C语言版 —— 链表增删改查实现(单链表+循环双向链表)

文章目录链表1. 链表的基本概念2. 无头非循环单链表实现1) 动态申请节点2) 打印链表元素3) 插入节点头插法尾插法在指定位置之前插入在指定位置之后插入4) 删除节点删除头部节点删除末尾节点删除指定位置之前的节点删除指定位置之后的节点删除指定位置的节点5) 查找元素6) 销毁…

【图像评价】无参考图像质量评价NIQE【含Matlab源码 681期】

⛄一、无参考图像质量评价NIQE简介 理论知识参考&#xff1a;通用型无参考图像质量评价算法综述 ⛄二、部分源代码 function [mu_prisparam cov_prisparam] estimatemodelparam(folderpath,… blocksizerow,blocksizecol,blockrowoverlap,blockcoloverlap,sh_th) % Input …

013 单词速记

converse adj.相反的&#xff0c;颠倒的 v.交谈 con(加强语气)vers&#xff08;转反转&#xff09;e->反转 n.conversation 谈话&#xff0c;对话 adv.conversely 相反的 controversy n.争端 contro(counter) 相反 vers 转 lead to ~ 导致争端 contraversial 有争议…

MySQL-内置函数

文章目录内置函数日期函数字符串函数数学函数其他函数内置函数 日期函数 current_date();current_time();current_timestamp(); 应用&#xff1a; 创建生日表 插入数据&#xff1a; 创建评论区 采用datetime 时间戳自动填充时间 查询两分钟之内发的帖子 评论时间2min…

C语言期末集训1(大一,超基础,小猫猫大课堂配套练习)——顺序结构和分支结构的题

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

安科瑞配电室环境监控系统解决方案-Susie 周

1、概述 配电室综合监控系统包括智能监控系统屏、通讯管理机、UPS电源、视频监控子系统&#xff08;云台球机、枪机&#xff09;、环境监测子系统&#xff08;温度、湿度、水浸、烟感&#xff09;、控制子系统&#xff08;灯光、空调、除湿机、风机、水泵&#xff09;、门禁监…

Redis分布式锁 - 基础实现及优化

应用场景 互联网秒杀抢优惠卷接口幂等性校验 代码示例 案例1 - StringRedisTemplate基础实现 package com.wangcp.redisson;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org…

以流量为王的时代,如何获得不错的流量,泰山众筹如何脱颖而出?

由于互联网、疫情等因素的影响&#xff0c;实体业务变得越来越困难。许多实体店已经开始转向在线电子商务&#xff0c;但运营一个好的电子商务平台并不容易。没有稳定的流量和忠实的用户&#xff0c;很难达到理想的效果。那到底如何才能获得不错的“流量”呢&#xff1f;泰山众…

第十四届蓝桥杯集训——JavaC组第十三篇——for循环

第十四届蓝桥杯集训——JavaC组第十三篇——for循环 目录 第十四届蓝桥杯集训——JavaC组第十三篇——for循环 for循环(重点) 倒序迭代器 for循环死循环 for循环示例 暴力循环 等差数列求和公式 基础循环展开 循环控制语句 break结束 continue继续 for循环(重点) f…

【图像融合】多尺度奇异值分解图像融合【含Matlab源码 2040期】

⛄一、多尺度奇异值分解的偏振图像融合去雾算法简介 立足于提高传统算法的适应性&#xff0c;提高去雾图像的质量&#xff0c;本文设计了如图 2 所示的去雾算法流程。首先&#xff0c;使用基于最小二乘方法计算出更加精确的偏振信息&#xff0c;改善了以往偏振信息计算不准确的…

基于Qt(C++)实现(PC)学生信息管理系统【100010043】

学生信息管理系统 一、系统指南 本系统为表格式的学生信息管理系统&#xff0c;提供了文件新建、打开及保存功能&#xff0c;还可在表格中对数据进行增加、删除、修改、搜索&#xff0c;下面将一一介绍这些功能 1、新建文件 新建文件将会产生一个全新的空表格&#xff0c;…

基于java+springmvc+mybatis+vue+mysql的少儿编程管理系统

项目介绍 在国家重视教育影响下&#xff0c;教育部门的密确配合下&#xff0c;对教育进行改革、多样性、质量等等的要求&#xff0c;使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上少儿编程教育网站系统是一项十分…

原来这就是BFC,遇到样式问题别瞎搞了

看到一篇前端面试题&#xff0c;第一个问题是 什么是BFC &#xff1f;&#xff0c;一下子唤起了我的辛酸回忆&#xff0c;那是在七月&#xff0c;在沪漂找工作的路上&#xff0c;预约的一个电话面试&#xff0c;眼看着时间就要到了&#xff0c;人生第一次进星巴克&#xff0c;提…