前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 466. 统计重复个数(循环节)

LeetCode 466. 统计重复个数(循环节)

作者头像
Michael阿明
发布2020-07-13 15:29:36
6120
发布2020-07-13 15:29:36
举报

1. 题目

由 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 。

代码语言:javascript
复制
示例:
输入:
s1 ="acb",n1 = 4
s2 ="ab",n2 = 2

返回:
2

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

2. 解题

类似题目:

LeetCode 957. N 天后的牢房(查找循环节)

机器人大冒险

题目意思是:

给你s1,自己加自己,共n1次,然后s2也一样,有n2次

后者在前者里找自己的完整子序,最多出现了多少次

代码语言:javascript
复制
class Solution {
public:
    int getMaxRepetitions(string s1, int n1, string s2, int n2) {
    	if(n1*s1.size() < n2*s2.size())
    		return 0;
    	int len1 = s1.size(), len2 = s2.size(), cnt1 = 0, cnt2 = 0, i, j=0;
    	unordered_map<int,pair<int,int>> m;//j, cnt1, cnt2
    	while(cnt1 < n1)
    	{
    		for(i = 0; i < len1; ++i)
    		{
    			if(s1[i]==s2[j])
    				j++;
    			if(j==len2)//循环单个s2
    				j=0,cnt2++;//完整个数
    		}
    		cnt1++;//s1的个数
    		if(!m.count(j))//j停在什么位置
    			m[j] = make_pair(cnt1, cnt2);//记录停在j位置时的cnt
    		else
    		{	//再次找到同一个 j 时,产生循环节了
    			int lastcnt1 = m[j].first;//上次的cnt
    			int lastcnt2 = m[j].second;
    			int gap1 = cnt1-lastcnt1;//做差,中间间隔有多少个
    			int gap2 = cnt2-lastcnt2;
    			int num = (n1-cnt1)/gap1;//剩余的够多少个循环
    			cnt1 += num*gap1;//cnt1 直接+到接近结束
    			cnt2 += num*gap2;
    		}
    	}
    	return cnt2/n2;//n1个s1可以找到cnt2个s2,可以找到cnt2/n2 个(n2*s2)
    }
};

4 ms 6.3 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档