比较java中的字符串并删除它们相同的字符串部分

时间:2012-09-27 11:20:16

标签: java algorithm

我和我有两个字符串:

s1="MICROSOFT"
s2="APPLESOFT"

我需要比较字符串并从第二个字符串中删除重复部分(总是朝向末尾)。所以我应该把“MICROSOFT”和“APPLE”作为输出。

我已逐字符地比较了两个字符串。

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

它应检查字符串,如果两个字符串在字符串结尾之前具有相同的字符,那么我需要从第二个字符串中删除该冗余部分,在本例中为SOFT。但我想不出如何从这里开始。

可能会有更多重复......但我们必须只删除那些持续相同的重复项。如果我有APPWWSOFT和APPLESOFT,我应该在第二个字符串中再次获得APPLE,因为我们在两者之间获得了与WW不同的LE

你能帮帮我吗?

7 个答案:

答案 0 :(得分:4)

搜索并阅读最长公共子序列,您可以找到有效的算法来找出两个输入字符串的LCS。找到输入字符串的LCS后,很容易操作输入。例如,在您的情况下,LCS算法会将“SOFT”作为这两个字符串的LCS,然后您可以检查LCS是否在第二个输入的最后部分,然后轻松删除它。我希望这个想法有所帮助。

Java中的示例LCS代码在此处,请尝试:http://introcs.cs.princeton.edu/java/96optimization/LCS.java.html

示例场景(伪代码):

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.

答案 1 :(得分:2)

据我了解,您希望从两个字符串中删除任何相同的字符。相同的意思是:相同的位置和相同的字符(代码)。我认为以下线性复杂性解决方案是最简单的:

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

答案 2 :(得分:2)

尝试这个算法 - 创建第一个字符串的字符序列,并在第二个字符串中找到它。

表现 -
平均情况=(s1.length() - 1)sq

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

输出 - APPLESOFT - SOFT - APPLE

答案 3 :(得分:1)

如果您希望修改StringBuffer,则应该使用String

在这种情况下,你可以增加一个StringBuffer,在其中你可以继续附加不匹配的字符: -

    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"

答案 4 :(得分: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++;
    }


}

     }

我已经编辑了代码,你可以再试一次。

答案 5 :(得分:0)

尝试这个,没有经过测试

 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, " "));

答案 6 :(得分:0)

我绞尽脑汁后解决了我的问题。请随时纠正/改进/优化我的代码。该代码不仅适用于“MICROSOFT”和“APPLESOFT”输入,还适用于“APPWWSOFT”和“APPLESOFT”之类的输入(我需要从上面的两个输入中删除连续重复项 - SOFT)。我正处于学习阶段,我将非常感谢任何有价值的投入。

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