Tengo que decir el número mínimo de veces de cuerda A
necesidades que se repite de manera que la cadena B
se convierte en una subcadena de A
.
Mi respuesta es incorrecta para algunos casos de prueba como
A = "abc"
B = "cabcabca"
Mi salida está llegando 3..it debe haber 4.
Mi código es-
class Solution {
public int repeatedStringMatch(String A, String B) {
int count = 0;
while (A.length() <= 1000) {
if (A.indexOf(B) != -1)
return (count + 1);
else
A = A + A;
count++;
}
return -1;
}
}
El problema es debido A=A+A;
, ya que hace A
que abcabc
después de la primera iteración, abcabcabcabc
después de la segunda iteración, abcabcabcabcabcabcabcabc
después de la tercera iteración y así sucesivamente es decir, en vez de conseguir adjuntas, la cadena se está duplicado en cada iteración.
Es como se le ha dado una tarea para agregar 2
a sí mismo en cada iteración es decir, después de la primera iteración, debe convertirse 2 + 2 = 4
, después de la segunda iteración, debe convertirse 4 + 2 = 6
, después de la tercera iteración debería convertirse 6 + 2 = 8
y así sucesivamente.
Mientras que la forma en que lo ha hecho, se convertirá 2 + 2 = 4
después de la primera iteración, 4 + 4 = 8
después de la segunda iteración, 8 + 8 = 16
después de la tercera iteración y así sucesivamente.
Como nota al margen, se debe evitar el uso de la concatenación de cadenas en un bucle. También debe seguir Java convención de nomenclatura , por ejemplo, el nombre de la variable A
debe ser a
.
Hacerlo de la siguiente manera:
public class Main {
public static void main(String[] args) {
// Test
System.out.println(repeatedStringMatch("abc", "cabcabca"));
}
static int repeatedStringMatch(String a, String b) {
int count = 1;
StringBuilder sb = new StringBuilder(a);
while (sb.length() <= 1000) {
if (sb.indexOf(b) != -1) {
return count;
} else {
sb.append(a);
count++;
}
}
return -1;
}
}
Salida:
4