2012-09-27 11 views
7

que tienen dos cadenas con mí:comparar cadenas en Java y quitar la parte de la cadena en la que son idénticos

s1="MICROSOFT" 
s2="APPLESOFT" 

que necesito para comparar las cadenas y quitar la parte duplicado (siempre hacia el final) de la segunda cuerda. Así que debería obtener "MICROSOFT" y "APPLE" como salida.

He comparado las cadenas carácter por carácter.

   String s1 = "MICROSOFT"; 
       String s2 = "APPLESOFT"; 

       for(int j=0; j<s1.length(); j++) 
       { 
        char c1 = s1.charAt(j); 
        char c2 = s2.charAt(j); 

        if(c1==c2) 
         System.out.println("Match found!!!"); 
        else 
         System.out.println("No match found!"); 
       } 

Se debe comprobar las cuerdas y si las dos cadenas tienen los mismos caracteres hasta el final de la cadena, entonces yo tenga que quitar esa parte redundante, suave en este caso, a partir de la segunda cadena. Pero no puedo pensar cómo proceder desde aquí.

Puede haber más duplicados ... pero tenemos que eliminar solo aquellos que son continuamente idénticos. si tengo APPWWSOFT y APPLESOFT, debería obtener APPLE de nuevo en la segunda cadena ya que tenemos LE diferente a WW entre

¿Pueden ayudarme por favor aquí?

+0

¿podría la parte duplicada estar en cualquier lugar de la cadena o siempre en el extremo? Por ejemplo, ¿podría querer eliminar "SOFT" de "MICSOFTRO" y "APPSOFTLE"? –

+0

también podría haber más duplicados? como APPAPPLESOFT y APPMICROSOFT deberían eliminar APP y SOFT? también, ¿el duplicado puede ser solo un personaje? o siempre hay mas de 1? – Th0rndike

+0

esta pregunta no debería recibir tantos votos, creo. @GauravOjha ¿estás preguntando sobre la diferencia de la segunda cuerda de la 1ra cuerda? si es así, esta pregunta debería recibir votos negativos y cerrada. – Juvanis

Respuesta

0

He resuelto mi problema después de sacar algunos sesos. Por favor, siéntase libre de corregir/mejorar/refinar mi código. El código no solo funciona para las entradas "MICROSOFT" y "APPLESOFT", sino también para entradas como "APPWWSOFT" y "APPLESOFT" (necesitaba eliminar los duplicados continuos del extremo - SOFT en las dos entradas anteriores). Estoy en la etapa de aprendizaje y agradeceré cualquier información valiosa.

public class test 
    {   
     public static void main(String[] args) 
     { 
      String s1 = "MICROSOFT"; 
      String s2 = "APPLESOFT"; 

      int counter1=0; 
      int counter2=0; 

      String[] test = new String[100]; 
      test[0]=""; 

      for(int j=0; j<s1.length(); j++) 
      { 
       char c1 = s1.charAt(j); 
       char c2 = s2.charAt(j); 

       if(c1==c2) 
       { 
        if(counter1==counter2) 
        { 
         //System.out.println("Match found!!!"); 
         test[0]=test[0]+c2; 
         counter2++; 
         //System.out.println("Counter 2: "+counter2); 
        } 
        else 
         test[0]=""; 
       } 
       else 
       { 
        //System.out.print("No match found!"); 
        //System.out.println("Counter 2: "+counter2); 
        counter2=counter1+1; 
        test[0]=""; 
       } 

       counter1++; 
       //System.out.println("Counter 1: "+counter1); 
          } 

      System.out.println(test[0]); 
      System.out.println(s2.replaceAll(test[0]," ")); 
     } 
    } 
0

probar esto, no se ha probado tú

String s1 = "MICROSOFT"; 
     String s2 = "APPLESOFT"; 
     String s3=""; 
     for(int j=0; j<s1.length(); j++) 
     { 
      if(s1.charAt(j)==s2.charAt(j)){ 
       s3+=s1.charAt(j); 
      } 
     } 
     System.out.println(s1.replace(s3, " ") + " \n"+ s2.replace(s3, " ")); 
+2

Creo que te refieres a '! =' En lugar de '==' y no necesitarás reemplazarlo. Reemplazar no funcionaría si los personajes no están juntos. –

+0

@PeterLawrey comparo los caracteres y si son iguales, añádelo a s3. como dije no probado: P – PermGenError

+0

@Chaitanya .. Si está intentando agregar ... Entonces 'StirngBuffer' sería una mejor opción ... (Y en lugar de agregar el carácter coincidente, puede agregar el carácter no coincidente ... lo salve del código 'replace'.) –

4

buscar y leer acerca común más larga subsecuencia, se pueden encontrar algoritmos eficientes para averiguar el LCS de dos cadenas de entrada. Después de encontrar el LCS de las cadenas de entrada, es fácil manipular las entradas. Por ejemplo, en su caso, un algoritmo LCS encontrará "SUAVE" como el LCS de estas dos cadenas, luego podrá verificar si el LCS está en la parte final de la segunda entrada y luego eliminarlo fácilmente. Espero que esta idea ayude.

Un ejemplo de código en Java LCS está aquí, probarlo: http://introcs.cs.princeton.edu/java/96optimization/LCS.java.html

Escenario de ejemplo (pseudocódigo):

input1: "MISROSOFT"; 
input2: "APPLESOFT"; 

execute LCS(input1, input2); 
store the result in lcs, now lcs = "SOFT"; 

iterate over the characters of input2, 
if a character exists in lcs then remove it from input2. 
+0

Quiere eliminar cualquier carácter similar de las 2 cadenas. Por lo tanto, no creo que se pueda aplicar subsecuencia común más larga ... solo si la aplica repetidamente ... – Razvan

+0

Mire esto - http://stackoverflow.com/questions/2929557/java-longest-common-secuencia – Cid

0

Usted no debe usar StringBuffer si desea que su String a modificar ..

Y en este caso, puede tener un extra StringBuffer, en el que puede seguir añadiendo carácter no coincidente: -

StringBuffer s1 = new StringBuffer("MICROSOFT"); 
    StringBuffer s2 = new StringBuffer("APPLESOFT"); 
    StringBuffer s3 = new StringBuffer(); 

    for(int j=0; j<s1.length(); j++) 
    { 
     char c1 = s1.charAt(j); 
     char c2 = s2.charAt(j); 

     if(c1==c2) { 
      System.out.println("Match found!!!"); 
     } else { 
      System.out.println("No match found!"); 
      s3.append(c1); 
     } 
    } 
    s1 = s3; 
    System.out.println(s1); // Prints "MICRO" 
+0

Este código (así como los OP) ** NO ** buscará/eliminará nada en "MICROSOFT" y "APPLESOFT" par –

+0

@GermannArlington .. Este código no elimina nada de 'MICROSOFT' o' APPLESOFT' .. Pero está creando un nuevo 'StringBuffer' de carácter no coincidente .. Que luego se asignará al 's3' original. Imprime' MICRO' carácter no coincidente que OP quiere .. –

+0

** NO ** imprime algo útil (coincidencias) para ** mis ** dos cadenas dadas. Pruébalo. –

2

Por lo que tengo entendido, desea eliminar los caracteres idénticos de las dos cadenas. Por idéntico quiero decir: la misma posición y el mismo carácter (código). Creo que la siguiente solución complejidad lineal es el más simple:

StringBuilder sb1 = new StringBuilder(); 
StringBuilder sb2 = new StringBuilder(); //if you want to remove the identical char 
              //only from one string you don't need the 2nd sb 
char c; 
for(int i = 0; i<Math.min(s1.length,s2.length);i++){ 
    if((c = s1.charAt(i)) != s2.charAt(i)){ 
      sb1.append(c); 
    } 
} 
return sb1.toString(); 
+0

Tu código es el mejor Probé todas las soluciones en este post kudos – subash

2

probar este algo- crear personajes secuencias de su primera cadena y encontrarlo en la segunda cadena.

rendimiento -
caso promedio = (s1.length() - 1) cuadrados

public class SeqFind { 
    public static String searchReplace(String s1,String s2) { 
     String s3; 
     boolean brk=false; 
     for(int j=s1.length();j>0&&!brk;j--){ 
     for (int i = j-4; i > 0; i--) { 
      String string = s1.substring(i,j); 
      if(s2.contains(string)){ 
       System.out.println(s2+" - "+string+" "+s2.replace(string,"")); 
       brk=true; 
       break; 
      } 
     } 
    } 
     return s3;  
    } 
    public static void main(String[] args) { 
     String s1 = "MICROSOFT"; 
     String s2 = "APPLESOFT"; 
     String s3 = searchReplace(s1,s2); 
    } 
} 

fuera ponga - Applesoft - SUAVE - APPLE

+0

Gracias por tu respuesta. Si entiendo bien este algoritmo es encontrar el primer patrón coincidente entre las dos cadenas y eliminarlo de la segunda cadena. ¿Derecha? Es casi lo que quiero, pero quiero que el patrón coincidente se vea desde el final.Entonces, si tomo dos cadenas como "APPWWSOFT" y "APPLESOFT", obtendré "APPLESOFT - APP LESOFT" como salida ahora, sin embargo, necesito "APPLESOFT - SOFT - APPLE" como salida. –

+0

código actualizado y esto comenzará a buscar desde el final y al menos 4 palabras deben coincidir –

+0

Muchas gracias Quoi (Subhrajyoti) !! Funciona como un encanto ... pero he resuelto mi problema y publicado la solución a continuación. Nada te da más placer que tu propio código de trabajo :) ¡Aprecia tu ayuda! –

1
public class Match { 

public static void main(String[] args) 
{ 
    String s1="MICROSOFT"; 
    String s2="APPLESOFT"; 
    String[] s=new String[10]; 
    String s3; 
    int j=0,k=0; 
    for(int i=s2.length();i>0;i--) 
    { 
     s[j]=s2.substring(k,s2.length()); 
     if(s1.contains(s[j])) 
     { 
      s3=s2.substring(0,j); 
           System.out.println(s1+""+s3); 

      System.exit(0); 

     } 
     else 
     { 
      System.out.println(""); 
     } 
           j++; 
           k++; 
    } 


} 

    } 

He editado el código que puede darle otra oportunidad.

+0

Me temo que no es así. –

+0

He resuelto mi problema con Kanhai y publicado la solución, pero también revisaré la tuya y te dejaré saber si funciona. ¡¡Gracias!! –

+0

sí, ahora funciona Kanhai. –

Cuestiones relacionadas