代码随想录算法训练营第十天 | KMP算法 字符串总结 双指针回顾

简介: 代码随想录算法训练营第十天 | KMP算法 字符串总结 双指针回顾

前言

昨天没有更新训练营第九天内容,是因为昨天的任务是 LeetCode 28. 实现 strStr(),使用 KMP算法进行解答, 关于KMP算法可以查看我之前的文章 从 KMP算法到 Java的 String.indexOf(String str)方法, 今天还是关于 KMP算法的,但是主要是复习,想学习KMP算法相关的可以看我之前的文章

今日任务:

459.重复的子字符串

题目描述

网络异常,图片无法展示
|

思路分析

老规矩 去判断字符串是否为空, 如果为 null就直接返回掉

为字符串新增虚拟头,方便我们后续的操作

然后里面一整个for循环都是用来记录前缀表用的, 具体如下

for (int i = 2, j = 0; i <= len; i++) {
        // 处理元素不一致的情况, 进行后退操作
        while(j > 0 && s.charAt(i) != s.charAt(j + 1)){
            j = next[j];
        }
        // 如果元素一致, 则 j++,表示公共前缀+1
        if (s.charAt(i) == s.charAt(j + 1)){
            j++;
        }
        // 存放当前元素和下标几有公共前缀
        next[i] = j;
    }
复制代码

最后去判断最后一个数的最长公共前缀下标是否大于0, 如果不大于 0就证明这个元素肯定没有公共前缀, 那肯定是错的, 如果大于0之后, 再去计算出公共前缀的长度, 用字符串的长度 % 公共前缀的长度, 如果等于 0,则代表字符串都是由这一个公共前缀重复组成的

这一段不是很好理解,可以去看 代码随想录 或者 我的文章也可以通过 LeetCode里面的代码示例来 debug调试理解

代码展示

public static boolean repeatedSubstringPattern(String s) {
    // 判断当前入参是否为 null
    if (s.length() == 0){
        return false;
    }
    // 获取初始 s的长度
    int len = s.length();
    // 为字符串 s新增虚拟头结点
    s = " " + s;
    // 根据新的字符串生成 公共前缀数组
    int[] next = new int[len+1];
    // 遍历
    for (int i = 2, j = 0; i <= len; i++) {
        // 处理元素不一致的情况, 进行后退操作
        while(j > 0 && s.charAt(i) != s.charAt(j + 1)){
            j = next[j];
        }
        // 如果元素一致, 则 j++,表示公共前缀+1
        if (s.charAt(i) == s.charAt(j + 1)){
            j++;
        }
        // 存放当前元素和下标几有公共前缀
        next[i] = j;
    }
    // 判断是否为一个子串重复构成
    if (next[len] > 0 && len % (len - next[len]) == 0){
        return true;
    }
    return false;
}
复制代码

提交结果

网络异常,图片无法展示
|

字符串总结

什么是字符串

字符串就是由一堆字符组成的有限序列,也可以理解为一个字符数组,毕竟我们遍历字符串的时候通常是转成一个 char[]或者获取指定下标的字符进行操作

// 遍历字符串的常规操作
String str = "abc";
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
    System.out.println(chars[i]);
}
for (int i = 0; i < s.length(); i++) {
    System.out.println(s.charAt(i));
}
复制代码

使用类的已有方法做算法题吗?

除非你了解这个方法的内部实现, 否则是不建议在做算法题的时候直接使用方法的

双指针法

在字符串反转,移除元素,反转单词等题中都有使用到双指针法,在工作中也有真真切切的去使用到,由此可见算法还是要会的,可以不精,但是当工作中碰到难题不至于两眼发懵

同时双指针法的时间复杂度是 O(n)

反转系列

这个感觉相对简单一点,主要就是在细节处理上,这里借用代码随想录的一句话:当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章

KMP

KMP 算法就是处理字符串匹配等问题的, 它利用了公共前缀来记录之前匹配过的信息, 能够让我们节省很多时间不用去重复匹配

这个真的很难,很重要, 我第一次看的时候看文字真的一脸懵逼,看了三遍视频,又 debug了一遍才明白

总结

可能是距离上次做字符串部分还不到一个月,这次做起来有种游刃有余的感觉,也可能是因为这次简单题居多的原因吧,等到后面回溯之后估计就开始一脸懵逼了

双指针回顾

双指针法: 是指一快一慢两个指针在同一个 for循环内完成两个 for循环的工作

  • 暴力解法时间复杂度: O(n^2)
  • 双指针时间复杂度: O(n)

关于双指针法比较经典的题有: 反转字符串,判断一个字符串是否为回文字符串,在一个有序数组内判断存不存在两数之和等于target等

总结

一转眼代码随想录训练营已经十天了,十天的进度:数组,链表,哈希表,字符串,按照语句训练营时长两个月一刷还有五十天,坚持就是胜利,日积硅步以致千里



目录
相关文章
|
10天前
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
2月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
2月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
51 3
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
11天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
5天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
7天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。