Rayman的绝顶之路——Leetcode每日一题打卡4
昨天有点忙,今天补一下卡。。
Leetcode466. 统计重复个数 题目:
由 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
思路:
- 分为 0 ~(n1-1)次拼接s1,记录下第0次时,s2出现的次数和指向s2的坐标;
- 循环找循环体;
- 如果找到了循环体,那么返回(循环体个数 * (单个循环体包含的s2数目) + 除去所有循环体字符串后,剩余拼接在一起的形成的字符串可以找出s2个数)/ n2;
- 没有找到循环体,那就直接返回迄今为止记录到的count数/n2。
Java AC代码如下:
import java.util.HashMap; import java.util.Map; public class 统计重复个数 { static int getMaxRepetitions(String s1, int n1, String s2, int n2) { int l1 = s1.length(); int l2 = s2.length(); if (l1 == 0 || l2 == 0 || n1 == 0 || n2 == 0) { return 0; } char[] c1 = s1.toCharArray(); char[] c2 = s2.toCharArray(); //经历多少s1 int couts1 = 0; // 经历多少s2 int couts2 = 0; // 当前在s2的位置 int p = 0; Map<Integer, int[]> mp = new HashMap<>(); //记录每一次s1扫描结束后当前的状态,寻找循环 while (couts1 < n1) { for (int i = 0; i < l1; i++) { if (c1[i] == c2[p]2020.4.18补卡(2020.4.19)) { p++; //s2扫描结束从头开始循环 if (p == l2) { p = 0; couts2++; } } } couts1++; if (!mp.containsKey(p)) { //记录当前状态 mp.put(p, new int[]{couts1, couts2}); } else { //出现了循环 //结束后p的位置和以前某一次一样,就是循环 int[] last = mp.get(p); int circle1 = couts1 - last[0]; int circle2 = couts2 - last[1]; couts2 += circle2 * ((n1 - couts1) / circle1); couts1 = couts1 + ((n1 - couts1) / circle1) * circle1; } } return couts2 / n2; } public static void main(String[] args) { System.out.println(getMaxRepetitions("abc", 4, "ab", 2)); } }
- 点赞
- 收藏
- 分享
- 文章举报
- Rayman的绝顶之路——Leetcode每日一题打卡7
- Rayman的绝顶之路——Leetcode每日一题打卡6
- 【每日打卡】Day15:最佳加法表达式(大数运算)JAVA实现(部分超时)
- 2018.04.01 leetcode 打卡
- LeetCode高频面试60天打卡日记Day01
- 每日打卡 | 5月12日教资&教招每日一练
- 【leetcode每日一题】100.same treet
- leetcode:58 Length of Last Word-每日编程第三十四题
- 每日打卡 2017.03.12 POJ题目分类 初级-一、基本算法
- LeetCode每日一题--Excel表列序号
- LeetCode每日一题--最大子序和
- 每日一题:LeetCode之括号生成
- leetcode:67 Add Binary-每日编程第四十三题
- 【每日打卡】Day27:三数之和 C++实现
- 每日一恋 - LeetCode 328. Odd Even Linked List(奇偶链表)
- 每日AC - 后缀表达式计算结果-leetcode-evaluate-reverse-polish-notation
- leetcode 每日一题 217. Contains Duplicate
- LeetCode每日一题 010 无重复字符的最长子串
- LeetCode每日一题——136. Single Number
- leetcode 打卡 2018.03.06 #766 Toepliz Matrix