Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较java中的字符串并删除字符串中相同的部分_Java_Algorithm - Fatal编程技术网

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

比较java中的字符串并删除字符串中相同的部分,java,algorithm,Java,Algorithm,我有两条线: s1="MICROSOFT" s2="APPLESOFT" 我需要比较字符串,并从第二个字符串中删除重复部分(始终朝向末尾)。所以我应该把“微软”和“苹果”作为输出 我已经逐个字符比较了这两个字符串 String s1 = "MICROSOFT"; String s2 = "APPLESOFT"; for(int j=0; j<s1.length(); j++)

我有两条线:

s1="MICROSOFT"
s2="APPLESOFT"
我需要比较字符串,并从第二个字符串中删除重复部分(始终朝向末尾)。所以我应该把“微软”和“苹果”作为输出

我已经逐个字符比较了这两个字符串

               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!");
               }
String s1=“微软”;
字符串s2=“APPLESOFT”;

对于(int j=0;j试试这个,不要测试你

 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, " "));
String s1=“微软”;
字符串s2=“APPLESOFT”;
字符串s3=“”;

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

下面是Java中的LCS代码示例,请尝试:

示例场景(伪代码):


如果希望修改
字符串
,则应使用
StringBuffer

在这种情况下,您可以有一个额外的
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"
StringBuffer s1=新的StringBuffer(“微软”);
StringBuffer s2=新的StringBuffer(“APPLESOFT”);
StringBuffer s3=新的StringBuffer();

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

 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();
StringBuilder sb1=新的StringBuilder();
StringBuilder sb2=new StringBuilder();//如果要删除相同的字符
//仅从一个字符串中,您不需要第二个sb
字符c;

对于(inti=0;i尝试此算法-创建第一个字符串的字符序列,并在第二个字符串中找到它

性能-
平均案例=(s1.length()-1)sq

发出- 苹果软苹果

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


}

     }

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

我绞尽脑汁解决了问题。请随时更正/改进/完善我的代码。该代码不仅适用于“MICROSOFT”和“APPLESOFT”输入,也适用于“APPWWSOFT”和“APPLESOFT”等输入(我需要从上述两种输入中的end-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]," "));
        }
    }
公共类测试
{           
公共静态void main(字符串[]args)
{
字符串s1=“MICROSOFT”;
字符串s2=“APPLESOFT”;
int计数器1=0;
int计数器2=0;
字符串[]测试=新字符串[100];
测试[0]=“”;

对于(int j=0;jc)重复部分是在字符串中的任何位置还是始终在末尾?例如,您可能希望从“MICSOFTRO”和“APPSOFTLE”中删除“SOFT”?还会有更多的重复项吗?像APPAPPLESOFT和APPMICROSOFT应该删除APP和SOFT?而且,重复项只能是一个字符?或者总是超过1个字符?我想这个问题不应该得到这么多的赞成票。@GauravOjha你是在问第二个字符串与第一个字符串的差异吗?如果是,这个问题应该得到否定票nd关闭。@猫:它总是在黑暗中end@Th0rndike:是的,可以有更多的副本…但我们必须只删除那些连续相同的。如果我有APPWWSOFT和AppeSoft,我应该在第二个字符串中再次获得APPLE,因为我们在betwen中得到了与WW不同的LE。我想你的意思是
!=
,而不是
=
,而你on不需要替换。如果字符不在一起,替换将不起作用。@PeterLawrey我比较字符,如果字符相等,则将其附加到s3。正如我所说的未测试:P@Chaitanya..如果您试图追加..,那么
StirngBuffer
将是一个更好的选择。。(您可以附加不匹配的字符,而不是附加匹配的字符。。将从
replace
code]中拯救您。)@RohitJain是的,性能方面。但我只在示例中展示了:P@chaitanya10..我明白……我只是在我认为应该引用的时候引用了……)他想从2个字符串中删除任何类似的字符。因此,我认为不能应用最长的公共子序列…只有反复应用它…请检查-此代码(以及OP)不会在“MICROSOFT”和“APPLESOFT”中找到/删除任何内容 pair@GermannArlington..此代码没有从
MICROSOFT
APPLESOFT
中删除任何内容。但它正在创建一个新的
StringBuffer
非匹配字符..该字符稍后分配给原始
s3'..它将打印OP想要的
MICRO`非匹配字符..它不会打印任何有用的内容(比赛)对于我的两个给定字符串。请尝试一下。很抱歉,您正在谈论的是哪个
strings
?..OP不希望
匹配的
字符串,他想删除它们..因此,我使用了这种方法..我欢迎您对代码的任何改进提出建议..因此,OP想从第二个字符串中删除任何?子字符串?they不想删除字符串的匹配部分?您的代码将找不到任何匹配项,无法删除我在第一条评论中建议的两个字符串:“MICROSOFT”和“APPLESOFT”。您的代码将打印“MICROSOFT”(完整word,不删除任何内容)因为你只做位置匹配,当s1比s2长时,它也会爆炸。你需要更多建设性的建议吗?谢谢你的回答。如果我理解正确,这个算法就是在两个字符串之间找到第一个匹配模式,然后从第二个字符串中删除它。对吗?这几乎就是我想要的,bu
   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++;
    }


}

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