2012-09-27 8 views
7

Ich habe zwei Saiten mit mir:Strings in Java vergleichen und den Teil der Zeichenfolge entfernen, wo sie identisch sind

s1="MICROSOFT" 
s2="APPLESOFT" 

Ich brauche die Saiten zu vergleichen und das doppelte Teil entfernen (immer gegen Ende) aus dem zweite Saite. Also sollte ich "MICROSOFT" und "APPLE" als Ausgabe bekommen.

Ich habe beide Zeichenfolgen Zeichen für Zeichen verglichen.

   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!"); 
       } 

Es soll die Saiten überprüfen und wenn die beiden Strings bis zum Ende der Zeichenfolge gleiche Zeichen haben, dann brauche ich, dass redundanten Teil, SOFT in diesem Fall zu entfernen, aus dem zweiten String. Aber ich kann mir nicht vorstellen, wie ich von hier aus vorgehen soll.

Es kann mehr Duplikate geben ... aber wir müssen nur diejenigen entfernen, die ständig identisch sind. wenn ich APPWWSOFT und APPLESOFT habe, sollte ich APPLE wieder in der zweiten Zeichenfolge bekommen, da wir LE anders als WW zwischen

bekommen haben Kannst du mir bitte helfen hier draußen?

+0

könnte das doppelte Teil irgendwo in der Zeichenfolge sein oder ist es immer am Ende? ZB möchten Sie vielleicht "SOFT" von "MICSOFTRO" und "APPSOFTLE" entfernen? –

+0

könnte es auch mehr Duplikate geben? wie APPAPLESOFT und APPMICROSOFT sollten APP und SOFT entfernen? Außerdem kann das Duplikat nur ein Zeichen sein? oder gibt es immer mehr als 1? – Th0rndike

+0

Diese Frage sollte nicht so viele Upvotes bekommen, denke ich. @GauravOjha Fragen Sie über 2. String Diff von der ersten Saite? Wenn ja, sollte diese Frage negative Stimmen erhalten und geschlossen werden. – Juvanis

Antwort

0

Ich habe mein Problem gelöst, nachdem ich einige Gehirne weggerissen habe. Bitte zögern Sie nicht, meinen Code zu korrigieren/verbessern/zu verfeinern. Der Code funktioniert nicht nur für "MICROSOFT" - und "APPLESOFT" -Eingänge, sondern auch für Eingaben wie "APPWWSOFT" und "APPLESOFT" (ich musste die fortlaufenden Duplikate vom Ende entfernen - SOFT in beiden obigen Eingängen). Ich bin in der Lernphase und ich werde alle wertvollen Inputs schätzen.

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

dies versuchen, nicht getestet du

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

Ich denke du meinst '! =' Anstelle von '==' und du wirst den Ersatz nicht brauchen. Ersetzen würde nicht funktionieren, wenn die Zeichen nicht zusammen sind. –

+0

@PeterLawrey ich vergleiche die Zeichen und wenn sie gleich sind dann an s3 anhängen. wie ich sagte, nicht getestet: P – PermGenError

+0

@Chaitanya .. Wenn Sie versuchen, anhängen .. Dann wäre 'StirngBuffer' eine bessere Wahl .. (Und anstatt das passende Zeichen anhängen, können Sie nicht übereinstimmende Zeichen anhängen. Will ersparen Sie sich 'ersetzen' code.) –

4

Suchen und lesen Sie über Längste gemeinsame Subsequence Sie effiziente Algorithmen finden die LCS von zwei Eingabezeichenfolgen, um herauszufinden. Nach dem Auffinden der LCS der Eingabe-Strings ist es einfach, die Eingaben zu manipulieren. Zum Beispiel wird in Ihrem Fall ein LCS-Algorithmus "SOFT" als LCS dieser beiden Strings finden, dann können Sie überprüfen, ob sich das LCS im letzten Teil der 2. Eingabe befindet und es dann leicht entfernen. Ich hoffe, diese Idee hilft.

Ein LCS Codebeispiel in Java hier ist, versuchen Sie es: http://introcs.cs.princeton.edu/java/96optimization/LCS.java.html

Beispielszenario (Pseudo-Code):

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

Er möchte alle ähnlichen Zeichen aus den 2 Zeichenfolgen entfernen. Also, ich denke nicht längste gemeinsame Subsequenz angewendet werden kann ... nur wenn Sie es wiederholt anwenden ... – Razvan

+0

Überprüfen Sie dies - http://StackOverflow.com/Questions/2929557/JavaLongestCommon-Subsequenz – Cid

0

Sie eher StringBuffer verwenden sollten, wenn Sie Ihre String wollen geändert werden ..

Und in diesem Fall können Sie eine zusätzliche StringBuffer haben, in der Sie weiterhin nicht übereinstimmendes Zeichen anhängen können: -

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

Dieser Code (sowie die OPs) werden ** NOT ** nichts in "MICROSOFT" und "APPLESOFT" -Paar finden und entfernen. –

+0

@GermannArlington .. Dieser Code entfernt nichts von 'MICROSOFT' oder' APPLESOFT'. Aber es erzeugt einen neuen 'StringBuffer' eines nicht übereinstimmenden Zeichens .. welches später dem Original' s3 'zugeordnet wird. Es druckt 'MICRO' nicht übereinstimmendes Zeichen welches OP will .. –

+0

Es wird ** NICHT ** drucke etwas Nützliches (Treffer) für ** meine ** zwei gegebenen Zeichenfolgen. Probieren Sie es aus. –

2

Soweit ich verstehe, möchten Sie identische Zeichen aus den beiden Zeichenfolgen entfernen. Mit identisch meine ich: gleiche Position und gleiches Zeichen (Code). Ich denke, die folgende lineare Komplexität Lösung ist die einfachste:

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

Ihr Code ist der beste Ich habe versucht, alle Lösungen in diesem Beitrag kudos – subash

2

Try this Algo- Zeichen Sequenzen Ihrer ersten Zeichenfolge erstellen und es in der zweiten Zeichenfolge zu finden.

Leistung -
Durchschnittliche case = (s1.length() - 1) ²

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

heraus gesetzt - Apple - SOFT - APPLE

+0

Vielen Dank für Ihre Antwort. Wenn ich richtig verstehe, findet dieser Algorithmus das erste übereinstimmende Muster zwischen den zwei Zeichenfolgen und entfernt es von der zweiten Zeichenfolge. Recht? Es ist fast das, was ich will, aber ich möchte das übereinstimmende Muster vom Ende gesehen werden.Also, wenn ich zwei Zeichenfolgen wie "APPWWSOFT" und "APPLESOFT" nehme, würde ich "APPLESOFT - APP LESOFT" als Ausgabe bekommen, aber ich brauche "APPLESOFT - SOFT - APPLE" als Ausgabe. –

+0

code aktualisiert und dies wird beginnen zu suchen von Ende und atleast 4 Wort sollte übereinstimmen –

+0

Vielen Dank Quoi (Subhrajyoti) !! Es funktioniert als ein Charme..aber ich habe mein Problem selbst gelöst und die Lösung unten veröffentlicht. Nichts gibt Ihnen mehr Vergnügen als Ihr eigener Arbeitscode :) Schätzen Sie Ihre Hilfe! –

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


} 

    } 

ich den Code bearbeitet haben Sie kann es noch einmal versuchen.

+0

Ich fürchte es tut es nicht. –

+0

Ich habe mein Problem Kanhai gelöst und die Lösung gepostet, aber ich werde auch Ihre überprüfen und lassen Sie wissen, ob es funktioniert. Vielen Dank!! –

+0

ja es funktioniert jetzt Kanhai. –