热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode466.统计重复个数

我的LeetCode:https:leetcode-cn.comuituring我的LeetCode刷题源码[GitHub]:https:github.comizhoujieAlg

我的LeetCode:https://leetcode-cn.com/u/ituring/

我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii

LeetCode 466. 统计重复个数

题目

由 n 个连接的字符串 s 组成字符串 S,记作 S = [s,n]。例如,[“abc”,3]=“abcabcabc”。

如果我们可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。例如,根据定义,”abc” 可以从 “abdbec” 获得,但不能从 “acbbe” 获得。

现在给你两个非空字符串 s1 和 s2(每个最多 100 个字符长)和两个整数 0 ≤ n1 ≤ 106 和 1 ≤ n2 ≤ 106。现在考虑字符串 S1 和 S2,其中 S1=[s1,n1] 、S2=[s2,n2] 。

请你找出一个可以满足使[S2,M] 从 S1 获得的最大整数 M 。

示例:

输入:
s1 ="acb",n1 = 4
s2 ="ab",n2 = 2
返回:
2

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

解题思路

一句话:求n1个s1拼接形成的S1删除若干字符后可以分成多少个由n2个s1拼接形成的S2;

思路1-寻找“循环节”然后根据循环节倍数关系求解

“循环节”是指若干个s1拼接起来删除若干字符后能得到一个S2,看图解:
《LeetCode 466. 统计重复个数》

所以,思路是先找“循环节”,然后看n1个s1拼接的S1中有多少个这样的循环节片段,再处理循环节前后剩余的一丢丢残余的s1片段,就能从S1中得到N个完整的s1,N/n2就得到了题目要求解的M值;
步骤:

  1. 从n1个s1中顺序匹配s2中的字符,记录完整匹配s2的数量,每匹配完一个s1就记录当前匹配到的s2的数量并记录匹配完第一个s1时s2中的待匹配字符索引位置;
  2. 在后续中若某次匹配完s1后在s2中的停止处索引等于首次的说明找了“循环节”,就可以按照上面说的思路开始数学计算;
  3. 若始终未找到循环节,则只能暴力匹配完n1个s1,有两种情况:
    • s2中的字符有的在s1中不存在,0匹配(可做特例先行判断,避免后面的无意义计算);
    • n1个s1处理后的长度恰只够一个S2,1匹配;

算法复杂度:

  • len1为s1长度,len2为s2长度,n1即题中n1个s1的n1
  • 时间复杂度: $ {\color{Magenta}{\Omicron\left(len1 \ast len2\right)}} $ 最坏时为n1\(\ast\)len1\(\ast\)len2
  • 空间复杂度: $ {\color{Magenta}{\Omicron\left(n1\right)}} $ 需要n1长度数组存s2的匹配数

算法源码示例

package leetcode;
/**
* @author ZhouJie
* @date 2020年4月19日 下午7:12:10
* @Description: 466. 统计重复个数
*
*/
public class LeetCode_0466 {
}
class Solution_0466 {
/**
* @author: ZhouJie
* @date: 2020年4月19日 下午7:12:31
* @param: @param s1
* @param: @param n1
* @param: @param s2
* @param: @param n2
* @param: @return
* @return: int
* @Description: 1-先尝试寻找循环体,便于计算可拼接的S2数量;
*
*/
public int getMaxRepetitions_1(String s1, int n1, String s2, int n2) {
int len1 = s1.length();
int len2 = s2.length();
// 特例判断
if (n1 == 0 || n2 == 0 || n1 * len1 return 0;
}
// 特例-若s2中字符有不在s1中的直接返回
char[] cs2 = s2.toCharArray();
for (char c : cs2) {
if (s1.indexOf(c) == -1) {
return 0;
}
}
char[] cs1 = s1.toCharArray();
// 寻找循环体时s2的下标
int index = 0;
int count = 0;
// 在s2中首次匹配到的字符索引位置
int firstIndex = 0;
// 记录在s1的第i次拼接时匹配到的s2的总数
int[] countRdecoder = new int[n1];
for (int i = 0; i for (int j = 0; j // 这是一个往复匹配,匹配到s1中的s2时就右移index,完全匹配s2时记录count并重置index
if (cs2[index] == cs1[j]) {
index++;
if (index == len2) {
count++;
index = 0;
}
}
}
// 首次匹配完时s1的停止位置
if (i == 0) {
firstIndex = index;
}
// 截至本次总匹配s2的数量
countRdecoder[i] = count;
// 若本次的停止位index与第一次时的停止位相同说明找到了循环体,开始数学计算并返回
if (i != 0 && index == firstIndex) {
// 第一部分:找到循环体时循环体内的匹配s1数量乘以n1个s2中有多少个这样的循环体片段(n1 - 1) / i)
int part1 = ((n1 - 1) / i) * (countRdecoder[i] - countRdecoder[0]);
// 第二部分:除去第一部分后剩余部分s2拼接起来可匹配s1的数量
int part2 = countRdecoder[(n1 - 1) % i];
// 总匹配s1的数量除以n2(n2个s1)即得题目要求的M
return (part1 + part2) / n2;
}
}
// 若未找到循环体 ,则直接暴力求解,这种情况基本只能是0或1了
return countRdecoder[n1 - 1] / n2;
}
}

推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
author-avatar
张哥他爹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有