466.count-the-repetitions.java 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. class Solution {
  2. public int getMaxRepetitions(String s1, int n1, String s2, int n2) {
  3. char[] chs1 = s1.toCharArray();
  4. char[] chs2 = s2.toCharArray();
  5. int m = chs1.length;
  6. int n = chs2.length;
  7. long[][] dp = new long[m][31];
  8. // dp[i][k] means the length of s1 required to match 2^k s2,
  9. // from the ith char of s1.
  10. // dp[i][k] = dp[i][k - 1] + dp[(i + dp[i][k - 1]) % m][k - 1]
  11. for (int i = 0; i < m; i++) {
  12. int l1 = i, l2 = 0;
  13. for (; l2 < n; l1++, l2++)
  14. for (; l1 < m * n1 && chs1[l1 % m] != chs2[l2]; l1++);
  15. dp[i][0] = l1 - i;
  16. }
  17. boolean loop = true;
  18. for (int k = 1; loop && k < 31; k++) {
  19. for (int i = 0; i < m; i++) {
  20. long prev = dp[i][k - 1];
  21. dp[i][k] = prev + dp[(int) ((i + prev) % m)][k - 1];
  22. }
  23. }
  24. long res = 0L, i = 0L;
  25. for (int k = 30; 0 <= k; k--) {
  26. long next;
  27. while ((next = i + dp[(int) (i % m)][k]) <= m * n1) {
  28. res += 1 << k;
  29. i = next;
  30. }
  31. }
  32. return (int) (res / n2);
  33. }
  34. }