public static Boolean cmprStr(String s1, String s2)
{
// STUFF
}
Quiero iterar a través de s1 para asegurarme de que cada carácter en s1 se incluye en s2.¿Cómo puedo iterar sobre una cadena en Java?
public static Boolean cmprStr(String s1, String s2)
{
// STUFF
}
Quiero iterar a través de s1 para asegurarme de que cada carácter en s1 se incluye en s2.¿Cómo puedo iterar sobre una cadena en Java?
public static Boolean cmprStr(String s1, String s2)
{
for (int i = s1.length() - 1; i >= 0; --i) {
if (s2.indexOf(s1.charAt(i)) == -1) {
return Boolean.FALSE;
}
}
return Boolean.TRUE;
}
FYI esto es O (n^2) – sjr
@Jim - No vi una etiqueta de tarea. @sjr - Lo sé. Veo que ha publicado una solución O (n + m). Eso es mejor asintóticamente, pero me pregunto cuánto tiempo deben pasar antes de que sea mejor en la práctica. Hay una gran cantidad de gastos generales en la construcción de HashSets como lo hace. –
No existe tal método getChar pero charAt – Dejell
¿Por qué no simplemente utiliza el método 'iguales'?
Boolean b = s1.equals(s2);
o 's1.compareTo (s2)' le proporcionará valores positivos negativos cero. cero significa igual. lea http://j.mp/mONeBc –
Esto no hace lo que la pregunta pide, que es verificar que todos los caracteres en 's1' también estén en' s2'. Como se dijo, no debe tener en cuenta el orden ni la cantidad de veces que aparece un personaje, y esto considera ambos. – ColinD
A menos que me falta algo (debo, después de que las cinco personas votaron por esto), OP no quiere comprobar si las cadenas son iguales, pero si 'para cada carácter c en s1: c está en s2'. -1 hasta que me doy cuenta de lo que me perdí. – delnan
for(char c: s1.toCharArray()){
if(s2.indexOf(c) == -1){
return false;
}
}
return true;
Suponiendo que
s1 = "aabb";
s2 = "ccddaannbbss";
devolverá true.
length()
le dará la longitud de una cadena
charAt(someIndex)
le dará el carácter en una posición determinada, por lo que se puede recorrer la primera cadena.
indexOf(achar)
le dará la indicación de un carácter en una Cadena, o -1 si no está allí. por lo tanto, deberías poder buscar cada personaje en la primera cadena dentro del segundo.
+1 por proporcionar las piezas necesarias en lugar de hacer su tarea. – delnan
Set<Character> charsInS1 = new HashSet<Character>();
for (int i = 0; i < s1.length(); i++) {
charsInS1.add(s1.charAt(i));
}
for (int i = 0; i < s2.length(); i++) {
charsInS1.remove(s2.charAt(i));
}
return charsInS1.isEmpty();
Esto tiene una complejidad de O(n+m)
... respuestas usando indexOf
tienen una complejidad O(n*m)
. Por supuesto, utiliza un poco de memoria extra temporalmente.
No solo esto consume un poco de memoria, sino que hay una considerable sobrecarga de procesamiento adicional en la construcción del 'HashSet'. Estoy dispuesto a apostar dólares a las rosquillas para cadenas muy cortas, esto tiene un rendimiento peor que las soluciones O (n * m) (cuando se implementan correctamente). Me pregunto cuánto tiempo deben ser las cadenas para que este enfoque se equilibre. –
Según tengo entendido, la pregunta sería.
//for each character in s1
//if s2 does not contain character return false
//return true
for(int i = 0; i < length s1; i++){
if(!s2.contains(String.valueOf(s1.charAt(i)))){
return false;
}
}
return true;
Esto verifica que cada carácter en s1 está en s2. No confirma el orden, ni cuántos hay, y no es un método igual.
recursiva:
public static Boolean cmprStr(String s1, String s2)
{
if(s1.length() == 0)
{
return true;
}
if(!s2.contains(s1.substring(0,1)))
{
return false;
}
return cmprStr(s1.substring(1), s2);
}
Cada String
es también un CharSequence
en Java. Por lo tanto, se pueden repetir fácilmente sobre un String
usando un simple bucle for:
int n = s.length();
for (int i = 0; i < n; ++i) {
char c = s.charAt(i);
...
}
Todas las otras respuestas son O (n^2). Aquí está una manera que es lineal en el tiempo (es decir, O (n)) usando Google Guava:
public static boolean cmprStr(String s1, String s2) {
Set<Character> desiredCharacters = Sets.newHashSet(Lists.charactersOf(s2));
return Sets.difference(Sets.newHashSet(Lists.charactersOf(s1)), desiredCharacters).isEmpty();
}
+1 para reducir la complejidad asintótica a O (n + m). Esto sería bueno para cadenas muy largas. Habrá menos sobrecarga en la construcción de un HashSet y luego iterar sobre los caracteres de la segunda cadena en busca de una membresía establecida. Además, desde el punto de vista heurístico, tiene sentido tachar la cuerda más corta y luego iterar sobre la más larga. –
// Here's some code I wrote to find CG ratio in a gene
public double findCgRatio(String gene)
{
double cCount =0.0;
double gCount =0.0;
gene = gene.toLowerCase();
for(char character : gene.toCharArray())
{
if(character == 'c')
{
cCount++;
}
else if(character == 'g')
{
gCount++;
}
}
System.out.println("CG Ratio was :" + (cCount/gCount));
return cCount/gCount; // cgRatio
}
Por favor, agregue algunas explicaciones también. –
caso insensible, o caso sensible? –
¿Quiere decir que cada personaje aparece en ambos, o que ambos son la misma cadena? – keyboardP
Cada carácter en s1 aparece en s2 – Shamoon