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; } }
(完)