当前位置: 首页 > news >正文

LeetCode题目笔记——459. 重复的子字符串,python从700ms到60ms

文章目录

    • 题目描述
    • 题目难度——简单
    • 方法一:模拟
      • 代码Python
    • 方法一优化
    • 方法二:一行代码解决
      • 代码
    • 总结

题目描述

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

输入: s = “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2:

输入: s = “aba” 输出: false 示例 3:

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

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/repeated-substring-pattern
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目难度——简单

方法一:模拟

  由子串重复构成它本身的话,最好情况下是偶数长度时,由一半的字符重复2次就能构成,对奇数个的话,要么是长度为3的子串构成,要么是长度为1,重复n次。那么我们就可以从长度为1的子字符串开始,逐渐到一半的字符,每次对子字符串进行多次复制,判断与原字符串是否相同。

代码Python

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        res = False
        length = len(s)
        for i in range(1, length // 2 + 1):
            subs = s[:i]
            for j in range(2, length // i + 1):
                if subs * j == s:
                    res = True
                    break 
            if res:
                break
        return res

在这里插入图片描述
  这个代码太low了,700多ms,甚至都不配上图。不过看代码雀实很慢,有好多无用的切片,字符串拼接等。接下来进行优化。

方法一优化

  根据前面的分析,我们知道一个字符串如果可以由子串重复多次来构成的话,那么他们之间的长度肯定是一个倍数关系,也就是说原字符串s的长度N,和子字符串subs的长度SN,存在N=SN×M的关系,这个M就是重复的次数。那么我们就可以像分解质因数那样,将N分解为多个SN×M的组合。以题目给的例子abcabcabcabc为例,它的长度为12。我们可以把它分解为:

12=1x12: a重复12次:aaaaaa…aa
12=2x6: ab重复6次:abab…ab 或者abcabc重复两次
12=3x4: abc重复4次 或者abca重复3次

  这样来看,我们就只需要从1开始,判断N对其取余能不能得到0,即能不能分解为两个数N、M相乘,然后再以子字串重复M次和原字符串s比对,就能得到答案。

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        res = False
        length = len(s)
        for a in range(1, length // 2 + 1):
            subs = s[:a]
            b = length / a
            if length % b != 0:
                continue
            if subs * int(b) == s:
                res = True
                break
        return res

在这里插入图片描述
  可以看到和原来相比,快了7倍,好歹能上官方的图了。但是呢,还是很慢,只超过了55%。还可以继续优化。字符串切片也是比较耗时的一个操作,上面的代码里我们在每次循环的第一步都是直接切片,而好多情况下b是不满足要求的,所以我们可以把切片放到判断b成功之后进行。

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        res = False
        length = len(s)
        for a in range(1, length // 2 + 1):
            b = length / a
            if length % b != 0:
                continue
            subs = s[:a]
            if subs * int(b) == s:
                res = True
                break
        return res

在这里插入图片描述
  又快了40ms,说明优化的还不错。

方法二:一行代码解决

  看了一下排在我前面的,几乎都是这个方法,就是直接判断s是不是s+s的子串,且起始位置不是0或n。具体的证明过程就不详说了,有一点复杂,感兴趣的读者可以去看官方题解。

代码

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        return (s + s).find(s, 1) != len(s)

'''
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/repeated-substring-pattern/solution/zhong-fu-de-zi-zi-fu-chuan-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
'''
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        return (s + s).find(s, 1) != s.size();
    }
};

/*作者:LeetCode-Solution
链接:https://leetcode.cn/problems/repeated-substring-pattern/solution/zhong-fu-de-zi-zi-fu-chuan-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/

总结

  时间是O(N),空间上,用到了额外的字符串来判断,所以是O(N)。第二种方法需要理论上的证明,有点复杂。

相关文章:

  • C++ | 12天学好C++ (Day 12)->结构图可视化、代码加通俗理解
  • 【深入理解Kafka系列】第五章 日志存储
  • 想做好数据可视化?手把手教你正确选择图表类型
  • C#【高级篇】 IntPtr是什么?怎么用?
  • 软考知识点---01计算机的基本组成---02存储系统
  • Day09JavaWeb第九次笔记---Request和Response学习
  • 第三章 Flink基础理论之内存优化及常见内存报错解决方案
  • 分数阶粒子群算法-附代码
  • springboot(三)
  • Kubernetes 常见面试题(六)
  • Linux安装禅道最新版
  • 【Bluetooth|蓝牙开发】十一、一文秒懂 | 超详细的Bluez交叉编译
  • TC8:SOMEIPSRV_FORMAT_01-10
  • 软考:信息安全工程师3
  • 接口(续)和Object类
  • Android框架之Volley
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Docker 笔记(2):Dockerfile
  • Docker入门(二) - Dockerfile
  • ECS应用管理最佳实践
  • Java IO学习笔记一
  • Java面向对象及其三大特征
  • js中forEach回调同异步问题
  • MySQL-事务管理(基础)
  • node入门
  • Python 反序列化安全问题(二)
  • spark本地环境的搭建到运行第一个spark程序
  • spring-boot List转Page
  • Vue.js-Day01
  • 安卓应用性能调试和优化经验分享
  • 创建一个Struts2项目maven 方式
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 微信小程序设置上一页数据
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 智能合约Solidity教程-事件和日志(一)
  • Semaphore
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ###STL(标准模板库)
  • #vue3 实现前端下载excel文件模板功能
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (Forward) Music Player: From UI Proposal to Code
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转载)Linux网络编程入门
  • .a文件和.so文件
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 材料检测系统崩溃分析
  • .net(C#)中String.Format如何使用
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET项目中存在多个web.config文件时的加载顺序
  • ??eclipse的安装配置问题!??
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @selector(..)警告提示