Leetcode.1316 不同的循环子字符串

news2024/12/29 10:18:34

题目链接

Leetcode.1316 不同的循环子字符串 rating : 1837

题目描述

给你一个字符串 text ,请你返回满足下述条件的 不同 非空子字符串的数目

  • 可以写成某个字符串与其自身相连接的形式(即,可以写为 a + a,其中 a 是某个字符串)。

例如,abcabc 就是 abc 和它自身连接形成的。

示例 1:

输入:text = “abcabcabc”
输出:3
解释:3 个子字符串分别为 “abcabc”,“bcabca” 和 “cabcab” 。

示例 2:

输入:text = “leetcodeleetcode”
输出:2
解释:2 个子字符串为 “ee” 和 “leetcodeleetcode” 。

提示:

  • 1 ≤ t e x t . l e n g t h ≤ 2000 1 \leq text.length \leq 2000 1text.length2000
  • text 只包含小写英文字母。

解法 : 字符串哈希

我们从 s 的每一个位置开始暴力枚举,时间复杂度是 O ( n 3 ) O(n^3) O(n3) 的,会超时。

在这里插入图片描述

会超时的代码:

class Solution {
public:
    int distinctEchoSubstrings(string s) {
        int n = s.size() , ans = 0;
        unordered_set<string> uset;

        for(int i = 0;i < n;i++){
            int m = (n - i) / 2;
            //从位置 i 开始 , 枚举长度为 len 的子串 t , 以及跟在 t 后面长度同样为 len 的子串 p
            //如果 t == q 并且 t 是一个新的子串那么我们就记录答案
            for(int len = 1;len <= m;len++){
                auto t = s.substr(i , len) , p = s.substr(i + len,len);
                if(uset.count(t)) continue;
                
                if(t == p){
                    ans++;
                    uset.insert(t);
                }
            }
        }
        return ans;
    }
};

对于上面的超时的代码,我们可以通过 字符串哈希 来优化这个枚举子串的过程。

字符串哈希:字面意思就是一个数来唯一的表示一个字符串,这样的话我们比较两个字符串是否相等,就可以通过它们各自的哈希值来 O ( 1 ) O(1) O(1) 的比较。

关于字符串哈希可以看这篇博客:字符串哈希。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

C++代码:

using ULL = unsigned long long;
const int P = 13131;

class Solution {
public:
    int distinctEchoSubstrings(string s) {
        int n = s.size() , ans = 0;
        unordered_set<ULL> uset;
        
        //使用无符号数来计算哈希值,就不需要取模操作了
        ULL p[n + 1],h[n + 1];
        memset(p,0,sizeof p);
        memset(h,0,sizeof h);

        p[0] = 1;
        //计算 s 哈希值的前缀和
        for(int i = 1;i <= n;i++){
            h[i] = h[i - 1] * P + s[i - 1];
            p[i] = p[i - 1] * P;
        }
        //返回区间 [l ,r] 的哈希值
        auto get = [&](int l,int r){
            return h[r] - h[l - 1] * p[r - l + 1];
        };


        for(int i = 0;i < n;i++){
            int m = (n - i) / 2;
            for(int len = 1;len <= m;len++){
                //因为 h 下标是从 1 开始的 , 所以所有下标都要 + 1
                //[i , i + len - 1]  -> [i + 1 , i + len]
                //[i + len , i + 2*len - 1] -> [i + len + 1 , i + 2*len]
                
                auto l = get(i + 1,i + len) , r = get(i + len + 1,i + 2 * len);
                if(uset.count(l)) continue;
                if(l == r){
                    uset.insert(l);
                    ans++;
                }
            }
        }
        return ans;
    }
};

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

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

相关文章

服务器感染了LockBit 3.0勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 在数字时代&#xff0c;恶意软件的威胁变得愈发严峻&#xff0c;而LockBit 3.0勒索病毒则是其中的顶尖恶势力之一。其先进的加密技术和毫不留情的勒索手段&#xff0c;使无数人蒙受损失。然而&#xff0c;我们不应束手无策。本文91数据恢复将带您深入了解Loc…

AndroidStudio通过Profiler查找内存泄漏

Fragment内存泄漏&#xff1a; AndroidStudio --> Profiler --> 勾选 show nearest Gc root only&#xff0c;然后查看非weakreference的引用&#xff08;weakreference是不会导致内存泄漏的&#xff09;&#xff0c;往下就能找自己项目里写的代码&#xff0c;一般此处…

旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?

齐奏AI交响曲的当下&#xff0c;赛道玩家各自精彩。其中&#xff0c;被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆&#xff0c;并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型&#xff0c;AI四小龙谁都不甘其后。 以深耕AIoT软硬一…

ASCP系列电气防火限流式保护器在养老院的应用-安科瑞黄安南

摘要&#xff1a;2020年&#xff0c;我国65岁及以上老年人口数量为1.91亿&#xff0c;老龄化率达到13.5%。总体来看&#xff0c;大部分省市的养老机构数量还较少。养老设施的建设与民生息息相关&#xff0c;养老院的电气安全也非常重要。如果发生电气火灾&#xff0c;对于行动不…

【多模态】24、开放词汇学习到底是什么?

文章目录 一、什么是开放词汇学习二、开放词汇学习的测评和数据集三、开放词汇目标检测3.1 Region-Aware Training3.2 Pseudo-Labeling3.3 Knowledge Distillation-Based3.4 Transfer Learning-Based3.5 总结3.6 效果 参考论文&#xff1a;A Survey on Open-Vocabulary Detecti…

Vue3 事件处理简单应用

去官网学习→事件处理 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 事件处理</h1><button v-on:click"numb 1">点击加1-----{{ numb }}</button><br/&…

独家揭秘Linux内核栈:内核态的奇妙之处和与用户态的差异

理解Linux内核栈可以从以下几个方面来考虑&#xff1a;内核态与用户态&#xff1a;在阅读Linux内核及相关资料时&#xff0c;需要明确它所描述的是内核态还是用户态的内容。这有助于理解所讨论的是在哪个执行环境下进行的操作。进程与线程的描述&#xff1a;用户态的进程和线程…

Yield Guild Games:社区更新 — 2023 年第二季度

本文重点介绍了 Yield Guild Games (YGG) 2023 年第二季度社区更新中涵盖的关键主题&#xff0c;包括公会发展计划 (GAP) 第 3 季的总结、YGG 领导团队的新成员以及 YGG 的最新消息地区公会网络和广泛的游戏合作伙伴生态系统。 在 YGG 品牌焕然一新的基础上&#xff0c;第二季…

ArcGIS Pro基础:【按顺序编号】工具实现属性字段的编号自动赋值

本次介绍一个字段的自动排序编号赋值工具&#xff0c;基于arcgis 的字段计算器工具也可以实现类似功能&#xff0c;但是需要自己写一段代码实现&#xff0c; 相对而言不是很方便。 如下所示&#xff0c;该工具就是【编辑】下的【属性】下的【按顺序编号】工具。 其操作方法是…

Openlayers实战:右键点击,弹出feature信息

鼠标作为一个重要的交互触发手段,不但有左点击,还有右点击。 Openlayers开发的项目中,我们取消鼠标右键默认菜单,右击后获取到的feature的信息值。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有,可…

Spring系列四:AOP切面编程

文章目录 &#x1f497;AOP-官方文档&#x1f35d;AOP 讲解&#x1f35d;AOP APIs &#x1f497;动态代理&#x1f35d;初始动态代理&#x1f35d;动态代理深入&#x1f35d;AOP问题提出&#x1f4d7;使用土方法解决&#x1f4d7; 对土方法解耦-开发最简单的AOP类&#x1f4d7;…

美国探亲签证怎样预约?

近年来&#xff0c;越来越多的人都对前往美国探亲感兴趣&#xff0c;然而在计划之初&#xff0c;签证预约却可能成为一个让人头疼的问题。那么&#xff0c;究竟如何预约美国探亲签证呢&#xff1f;下面知识人网小编就为大家详细介绍一下预约的流程和注意事项。 首先&#xff0c…

spring boot 集成mqtt

spring boot 集成mqtt 1.到官网下载软件 MQTT linux版本&#xff08;使用apt方式下载安装&#xff09; 执行 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash再执行 sudo apt-get install emqx最后启动 emqx startWindows版 下载解压后进入bin…

【从零学习python 】05. Python中的输出和输入

文章目录 输出一、普通的输出二、格式化输出格式化操作的目的什么是格式化 三、换行输出四、练习五、python2与python3里的区别 输入input进阶案例 输出 简单来说&#xff0c;就是将程序的运行结果显示出来。 一、普通的输出 生活中的“输出” 软件中的图形化界面输出 py…

C语言----字符串操作函数汇总

在C的库函数中&#xff0c;有丰富的字符串操作函数&#xff0c;在平时的coding中灵活运用这些库函数会达到事半功倍的效果 一&#xff1a;str系列 char *strcpy(s, ct)将字符串ct(包括\0)复制到字符串s中&#xff0c;并返回s&#xff0c;需要注意s的长度是否容纳ct。char *st…

TikTok推出PrivacyGo,品牌可与平台共享部分用户数据

1.TikTok宣布允许用户关闭内容自动显示功能 TikTok近日宣布修改运营方式&#xff0c;即允许用户关闭内容自动显示功能&#xff0c;以遵守将于8月底生效的欧盟新规定&#xff08;欧盟数字服务法案DSA&#xff09;&#xff0c;该法案对平台提出了新的要求&#xff0c;以更好地保…

Idea2023之热部署插件JRebel+XRebel激活及使用

使用的目的就是不用因为改动一点Java代码重复启动服务 JRable会自动检测代码变动重启服务,这也会变向增加计算机内存和性能消耗! 激活教程 1-生成guid guid 复制后下载exe文件 ReverseProxy_windows_amd64.exe 下载完毕后双击运行exe 初始只有第一行后面是激活过程中跑出…

Unity游戏源码分享-有意思的科普游戏3D-Electronic-Blocks-master

Unity游戏源码分享-有意思的科普游戏3D-Electronic-Blocks-master 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88190169

Spring Boot 简介与入门

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

软件性能测试有哪些测试指标?性能测试报告对软件产品起到的作用

在软件开发过程中&#xff0c;性能测试是一个至关重要的环节&#xff0c;主要关注软件系统在不同负载条件下的表现&#xff0c;以评估其稳定性、可扩展性和响应能力。它可以帮助开发人员评估软件系统的质量和性能。 一、软件性能测试的测试指标 性能测试的测试指标直接影响着…