• LeetCode——统计重复个数


    Q:由 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

    A:找循环节
    我们设计一个哈希表 recall :哈希表 recall 以 s2 字符串的下标 index 为索引,存储匹配至第 s1cnt 个 s1 的末尾,当前匹配到第 s2cnt 个 s2 中的第 index 个字符时, 已经匹配过的s1 的个数 s1cnt 和 s2 的个数 s2cnt 。
    我们在每次遍历至 s1 的末尾时根据当前匹配到的 s2 中的位置 index 查看哈希表中的对应位置,如果哈希表中对应的位置 index 已经存储元素,则说明我们找到了循环节。循环节的长度可以用当前已经匹配的 s1 与 s2 的数量减去上次出现时经过的数量(即哈希表中存储的值)来得到。
    然后我们就可以通过简单的运算求出所有构成循环节的 s2 的数量,对于不参与循环节部分的 s1,直接遍历计算即可
    代码:

        public static int getMaxRepetitions(String s1, int n1, String s2, int n2) {
            if (n1 == 0 || n2 == 0)
                return 0;
            char[] c1 = s1.toCharArray();
            char[] c2 = s2.toCharArray();
            int l1 = s1.length();
            int l2 = s2.length();
            int count1 = 0, count2 = 0;
            int p = 0;
            Map<Integer, int[]> map = new HashMap<>();
            while (count1 < n1) {
                for (int i = 0; i < l1; i++) {
                    if (c1[i] == c2[p]) {
                        p++;
                        if (p == l2) {
                            p = 0;
                            count2++;
                        }
                    }
                }
                count1++;
                if (!map.containsKey(p)) {
                    map.put(p, new int[]{count1, count2});
                } else {
                    int[] last = map.get(p);
                    int circle1 = count1 - last[0];
                    int circle2 = count2 - last[1];
                    count2 += circle2 * ((n1 - count1) / circle1);
                    count1 += ((n1 - count1) / circle1) * circle1;
                }
            }
            return count2 / n2;
        }
    
  • 相关阅读:
    poj3122
    poj1323
    poj1328
    poj1700
    poj2586
    存储过程
    java基础3
    springmvc ---->helloworld
    选取下拉框,显示对应的图片
    java基础2
  • 原文地址:https://www.cnblogs.com/xym4869/p/12736633.html
Copyright © 2020-2023  润新知