
Sponsored
Sponsored
This approach involves repeating the string a incrementally and checking if b becomes a substring. The minimum length of repeated a needed should be at least equal to b's length. Thus, start by repeating a just enough times to get a string longer than b and check if b is a substring. If not, repeat a one more time to cover scenarios where b spans two a's boundary.
Time Complexity: O((m + n) * n), where m is the length of a and n is the length of b. Space Complexity: O(m + n).
1public class Solution {
2 public int repeatedStringMatch(String a, String b) {
3 int m = a.length(), n = b.length();
4 int repeat = (n + m - 1) / m;
5 StringBuilder sb = new StringBuilder();
6 for (int i = 0; i <= repeat + 1; i++) {
7 if (sb.indexOf(b) != -1) return i;
8 sb.append(a);
9 }
10 return -1;
11 }
12 public static void main(String[] args) {
13 Solution solution = new Solution();
14 String a = "abcd", b = "cdabcdab";
15 System.out.println(solution.repeatedStringMatch(a, b));
16 }
17}This code builds strings by repeating a enough times and checks if b is included. If not, it attempts one more repetition in case b borders two repetitions of a.
This approach relies on two repeated concatenations of string a. As per the pigeonhole principle, if b can fit within the repeated strings, it should certainly fit within two full concatenated repetitions and its prefix or suffix match.
Time Complexity: O(m * n). Space Complexity: O(m).
1using System;
public class Solution {
public int RepeatedStringMatch(string a, string b) {
int m = a.Length, n = b.Length;
int repeatMax = (n + m - 1) / m;
string doubled = a + a;
for (int i = 0; i <= repeatMax; i++) {
if ((doubled + a).Substring(i).Contains(b))
return i + 1;
}
return -1;
}
public static void Main(string[] args) {
Solution solution = new Solution();
Console.WriteLine(solution.RepeatedStringMatch("abcd", "cdabcdab"));
}
}This C# code cleverly manages string assembly using a block information strategy, quickly searching a bounded area formed by two repetitions of a.