7

我有两个字符串:

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,因为我们之间的 LE 与 WW 不同

你们能帮我吗?

4

7 回答 7

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.
于 2012-09-27T11:27:10.207 回答
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();
于 2012-09-27T11:37:14.583 回答
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

于 2012-09-27T11:39:38.970 回答
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++;
    }


}

     }

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

于 2012-09-27T12:31:32.457 回答
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, " "));
于 2012-09-27T11:25:59.413 回答
0

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"
于 2012-09-27T11:33:36.823 回答
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]," "));
        }
    }
于 2012-09-27T15:11:53.773 回答