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

思路:

  1. 分为 0 ~(n1-1)次拼接s1,记录下第0次时,s2出现的次数和指向s2的坐标;
  2. 循环找循环体;
  3. 如果找到了循环体,那么返回(循环体个数 * (单个循环体包含的s2数目) + 除去所有循环体字符串后,剩余拼接在一起的形成的字符串可以找出s2个数)/ n2;
  4. 没有找到循环体,那就直接返回迄今为止记录到的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]) {
                    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));
    }
}

2020.4.18补卡(2020.4.19)

发布了10 篇原创文章 · 获赞 0 · 访问量 161

猜你喜欢

转载自blog.csdn.net/qq_40417046/article/details/105618217