zoukankan      html  css  js  c++  java
  • count-the-repetitions

    https://leetcode.com/problems/count-the-repetitions/

    下面是我的方法,结果对的,超时了。。。

    package com.company;
    
    
    class Solution {
        public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
            int len1 = s1.length();
            int[][]stores = new int[26][len1];
            int[] pos = new int[26];
            int[] cur = new int[26];
            int index;
    
            for (int i=0; i<len1; i++) {
                index = s1.charAt(i)-'a';
                stores[index][pos[index]] = i;
                pos[index] = pos[index] + 1;
            }
    
            int curPos = 0;
            int ret = 0;
            int len2 = s2.length();
            while (true) {
    
                for (int i=0; i<n2; i++) {
                    for (int j=0; j<len2; j++) {
                        index = s2.charAt(j) - 'a';
    
                        if (cur[index] >= pos[index] * n1) {
    
                            return ret;
                        }
    
                        int newPos = 0;
                        do {
                            newPos = cur[index] / pos[index] * len1 + stores[index][cur[index] % pos[index]];
                            cur[index] = cur[index] + 1;
                        } while (newPos < curPos && cur[index] < pos[index] * n1);
    
                        if (newPos < curPos) {
                            return ret;
                        }
                        curPos = newPos + 1;
    
    
                    }
                }
                ret++;
    
            }
    
        }
    }
    
    public class Main {
    
        public static void main(String[] args) throws InterruptedException {
    
            String s1 = "niconiconi";
            int n1 = 99981;
            String s2 = "nico";
            int n2 = 81;
    
            Solution solution = new Solution();
            int ret  = solution.getMaxRepetitions(s1, n1, s2, n2);
    
            // Your Codec object will be instantiated and called as such:
            System.out.printf("ret:%d
    ", ret);
    
            System.out.println();
    
        }
    
    }

    优化之后的结果,还是超时:

    加了string到array的优化,另外每次循环之后坐个判断剪枝。

    package com.company;
    
    
    class Solution {
        public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
            int len1 = s1.length();
            int[][]stores = new int[26][len1];
            int[] pos = new int[26];
            int[] cur = new int[26];
            int index;
    
            for (int i=0; i<len1; i++) {
                index = s1.charAt(i)-'a';
                stores[index][pos[index]] = i;
                pos[index] = pos[index] + 1;
            }
    
            int curPos = 0;
            int ret = 0;
            int len2 = s2.length();
            char[] array2 = s2.toCharArray();
            while (true) {
    
                for (int i=0; i<n2; i++) {
                    for (int j=0; j<len2; j++) {
                        index = array2[j] - 'a';
    
                        int newPos = 0;
                        while (cur[index] < pos[index] * n1) {
                            newPos = cur[index] / pos[index] * len1 + stores[index][cur[index] % pos[index]];
                            cur[index] = cur[index] + 1;
                            if (newPos >= curPos) {
                                break;
                            }
                        }
    
                        if (newPos < curPos) {
                            /*System.out.printf("index %d cur[index] %d pos[index] %d cur/-pos %d, store %d
    ",
                                    index, cur[index], pos[index], cur[index] % pos[index], stores[index][cur[index] % pos[index]]);
    
                            System.out.printf("newPos %d curPos %d
    ",
                                    newPos, curPos);
                                    */
                            return ret;
                        }
                        curPos = newPos + 1;
    
    
                    }
                }
                ret++;
                for (int i=0; i<26; i++) {
                    if (pos[i] > 0 && cur[i] >= pos[i] * n1) {
                        return ret;
                    }
                }
    
            }
    
        }
    }
    
    public class Main {
    
        public static void main(String[] args) throws InterruptedException {
    
            String s1 = "acb";
            int n1 = 4;
            String s2 = "ab";
            int n2 = 2;
    
            Solution solution = new Solution();
            int ret  = solution.getMaxRepetitions(s1, n1, s2, n2);
    
            // Your Codec object will be instantiated and called as such:
            System.out.printf("ret:%d
    ", ret);
    
            System.out.println();
    
        }
    
    }

    用了这种Brute Force的方法,居然比我的快。。。。。。

    public class Solution {
        public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
            char[] array1 = s1.toCharArray(), array2 = s2.toCharArray();
            int count1 = 0, count2 = 0, i = 0, j = 0;
            
            while (count1 < n1) {
                if (array1[i] == array2[j]) {
                    j++;
                    if (j == array2.length) {
                        j = 0;
                        count2++;
                    }
                }
                i++;
                if (i == array1.length) {
                    i = 0;
                    count1++;
                }
            }
            
            return count2 / n2;
        }
    }

    (完)

  • 相关阅读:
    【NOIP 2003】 加分二叉树
    【POJ 1655】 Balancing Act
    【HDU 3613】Best Reward
    【POJ 3461】 Oulipo
    【POJ 2752】 Seek the Name, Seek the Fame
    【POJ 1961】 Period
    【POJ 2406】 Power Strings
    BZOJ3028 食物(生成函数)
    BZOJ5372 PKUSC2018神仙的游戏(NTT)
    BZOJ4836 二元运算(分治FFT)
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6156332.html
Copyright © 2011-2022 走看看