LeetCode 466. 统计重复个数,循环字符串匹配优化

2024-01-03 15:04

本文主要是介绍LeetCode 466. 统计重复个数,循环字符串匹配优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目

1、题目描述

定义 str = [s, n] 表示 str 由 n 个字符串 s 连接构成。

  • 例如,str == ["abc", 3] =="abcabcabc" 。

如果可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。

  • 例如,根据定义,s1 = "abc" 可以从 s2 = "abdbec" 获得,仅需要删除加粗且用斜体标识的字符。

现在给你两个字符串 s1 和 s2 和两个整数 n1 和 n2 。由此构造得到两个字符串,其中 str1 = [s1, n1]str2 = [s2, n2] 。

请你找出一个最大整数 m ,以满足 str = [str2, m] 可以从 str1 获得。

2、接口描述

class Solution {
public:int getMaxRepetitions(string s1, int n1, string s2, int n2) {}
};

3、原题链接

466. 统计重复个数


二、解题报告

1、思路分析

官方给出的解法是循环节解法,笔者采用了类似KMP优化字符串匹配的思想,不难想到我们只要计算出n1个s1中匹配的s2的数量然后除以n2就是答案,那么我们无非就是在s1 * n1这个字符串上进行了一次字符串匹配,我们暴力的求解,即从第0个字符一直到len1 * n1个字符进行和s2的匹配,记录s2的数目则有如下暴力代码:

class Solution {
public:Solution(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);}int getMaxRepetitions(string s1, int n1, string s2, int n2) {int len1 = s1.size() , len2 = s2.size() , p2 = 0 , cnt = 0;for(int i = 0 ; i < n1 ; i++)for(int j = 0 ; j < len1 ; j++)if(s1[j] == s2[p2]){p2++;if(p2 == len2)p2 = 0 , cnt ++;}return cnt / n2;}
};

n1可以达到1e6量级,len1可以达到100量级,那么总体就是1e8量级,不出意外,49个样例全部通过但是卡常,所以还是没过。

但这说明只要对暴力解法进行小优化就可以通过本题。由于在一个循环字符串中寻找另一个字符串的数目,这显然有许多的冗余匹配,那么我们不妨像kmp那样,开一个数组nxt[],nxt[i]存储从s2下标i开始和单个s1能够匹配的字符串数目(这里s2是循环的,但是统计的是和单个s1匹配的字符数目),nxt的求解可以暴力求解,由于len1,len2不超过100,所以整体预处理不超过1e4

有了nxt后,我们再在n1 * s1 上进行匹配就可以优化为O(n1)了,为什么呢?

两个字符串从0开始匹配,第一个s1匹配结束,s2下标从0变为(nxt[0] + 0)%len2,再跟第二个s1匹配,s2下标又变为 ((0 + nxt[0]) % len1 + nxt[(0 + nxt[0]) % len1]) % len1……

直接看代码会明了很多

2、复杂度

时间复杂度: O(n1) 空间复杂度:O(L)

3、代码详解

​相比于循环节的方法,该方法的代码要简洁很多,当然该方法也可以进一步优化为循环节方法,如果让你将该方法进一步优化,那么阁下又该如何应对呢?
class Solution {
public:
int nxt[101] , len1 , len2 , sum;int getMaxRepetitions(string s1, int n1, string s2, int n2) {memset(nxt , 0 , sizeof(nxt));len1 = s1.size() , len2 = s2.size() , sum = 0;for(int i = 0 ; i < len2 ; i++)for(int j = i , k = 0 ; k < len1 ; k++)if(s2[j] == s1[k])nxt[i]++ , j = (j + 1) % len2;for(int i = 0 ,j = 0 ; i < n1 ; i++)sum += nxt[j] , j = (j + nxt[j]) % len2;return sum / (len2 * n2);}
};

这篇关于LeetCode 466. 统计重复个数,循环字符串匹配优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566091

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函