2011-05-30 20 views
6
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?

+0

caso insensible, o caso sensible? –

+2

¿Quiere decir que cada personaje aparece en ambos, o que ambos son la misma cadena? – keyboardP

+1

Cada carácter en s1 aparece en s2 – Shamoon

Respuesta

10
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; 
} 
+0

FYI esto es O (n^2) – sjr

+4

@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. –

+1

No existe tal método getChar pero charAt – Dejell

1

¿Por qué no simplemente utiliza el método 'iguales'?

Boolean b = s1.equals(s2); 
+0

o 's1.compareTo (s2)' le proporcionará valores positivos negativos cero. cero significa igual. lea http://j.mp/mONeBc –

+1

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

+1

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

9
for(char c: s1.toCharArray()){ 
    if(s2.indexOf(c) == -1){ 
      return false; 
    } 
    } 
    return true; 

Suponiendo que

s1 = "aabb"; 
    s2 = "ccddaannbbss"; 

devolverá true.

+3

Creo que iterar una cadena usando toCharArray copiará la cadena. Esto es probablemente menos eficiente que un bucle simple. – ceving

+0

Esto crea un objeto adicional que no es necesario para el propósito. – VishAmdi

8
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

+1 por proporcionar las piezas necesarias en lugar de hacer su tarea. – delnan

2
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.

+0

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. –

0

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); 
} 
0

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); 
    ... 
} 
3

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

+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. –

0
// 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 
     } 
+0

Por favor, agregue algunas explicaciones también. –

Cuestiones relacionadas