• 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;
        }
    }

    (完)

  • 相关阅读:
    JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)
    JavaScript权威设计--JavaScript脚本化文档Document与CSS(简要学习笔记十五)
    JavaScript权威设计--CSS(简要学习笔记十六)
    事件处理介绍(简要学习笔记十七)
    事件源,事件对象(简要学习笔记十八)
    XMLHttpRequest(简要学习笔记十九)
    UITextField的placeholder的字体颜色和大小
    UITextField弹出键盘挡住输入框问题
    屏幕适配
    GPUImage的简单使用
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6156332.html
Copyright © 2020-2023  润新知