7

私は2つのひもを持っています:

s1="MICROSOFT"
s2="APPLESOFT"

文字列を比較し、2 番目の文字列から重複部分 (常に最後に向かって) を削除する必要があります。したがって、出力として「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!");
               }

文字列をチェックし、2 つの文字列が文字列の最後まで同じ文字を持っている場合は、2 番目の文字列からその冗長部分 (この場合は SOFT) を削除する必要があります。しかし、ここからどう進めばいいのか思いつきません。

より多くの重複がある可能性があります...しかし、継続的に同一のものだけを削除する必要があります。APPWWSOFT と APPLESOFT がある場合、間に WW とは異なる LE があるため、2 番目の文字列で再び APPLE を取得する必要があります。

ここで私を助けてくれませんか?

4

7 に答える 7

4

Longest Common Subsequenceについて検索して読むと、2 つの入力文字列の LCS を見つけるための効率的なアルゴリズムを見つけることができます。入力文字列の LCS を見つけた後は、入力を簡単に操作できます。たとえば、LCS アルゴリズムがこれら 2 つの文字列の LCS として「SOFT」を検出する場合、LCS が 2 番目の入力の最後の部分にあるかどうかを確認してから、簡単に削除できます。このアイデアがお役に立てば幸いです。

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

私が理解している限り、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

このアルゴリズムを試してください-最初の文字列の文字シーケンスを作成し、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

変更しStringBufferたい場合は、むしろ使用する必要があります。String

そしてこの場合、あなたはあなたがStringBuffer一致しない文字を追加し続けることができる1つの余分を持つことができます:-

    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

これを試してみてください、あなたはテストされていません

 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 に答える