2016-10-06 4 views
0

フォームを縮小不可能なフォームに縮小する問題を解決しました。これが問題でした。文字列を減らすには

Shilには、N個の小文字の英字からなる文字列Sがあります。ある操作では、同じ値の隣接する文字のペアを削除できます。たとえば、文字列 "aabcc"は操作後に "aab"または "bcc"になります。

Shilは可能な限りSを小さくしたいと考えています。これを行うために、彼は上記の操作を実行できる回数だけ繰り返す。還元不可能な用紙を見つけて印刷してください。

最後の文字列が空の場合は、空文字列を出力します。それ以外の場合は、最後に縮小不可能な文字列を出力します。

サンプル入力0

aaabccddd

サンプル出力0

ABD

サンプル入力1

BAAB

サンプル出力1

空文字列

サンプル入力2

AA

サンプル出力2

空文字列

説明

サンプルケース0: Shilは、最終的な文字列を取得するために次の一連の操作を行うことができます。このように

、我々は印刷されます。

サンプルケース1: Shilは、最終的な文字列を取得するには次の一連の操作を行うことができます。 aaabccddd - > abccddd

abccddd - > abddd

abddd - > ABD

したがって、私たちは印刷します。abd

サンプルケース1: BAAB - > BB

BB - >空の文字列。

私が今まで行ってきたことは、JavaのStringBuilderを使って解決しようとしていることです。しかし、テストケースのいくつかは、他の人が行っていない間に渡され、エラーは何か分からないのですか?

これまで私が試したコードです。入力がBAABあるとき、それは誰も私を助けてください?advacnceに感謝をfails.Can aaabccddd

AAなどの

import java.util.Scanner; 

public class Solution { 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    StringBuilder sb = new StringBuilder(scan.nextLine()); 
    for(int i = 0; i < sb.length()-1; i++) 
     { 
      if(sb.charAt(i) == sb.charAt(i+1)) 
       sb.delete(i,i+2); 
       i = 0; 
     } 
    if(sb.length() == 0) 
     System.out.println("Empty String"); 
    else 
     System.out.println(sb.toString()); 
} 

}

入力 pass.But。

+0

は、私はあなたのプログラムを実行し、それが出力を印刷しているように見えますあなたの入力文字列 "baab"の "bb"として – mhasan

+0

これは_challenge_ですが、ここにはgithub https://www.hackerrank.com/challenges/reducからの解決策がありますed-stringとhttps://github.com/shengmin/coding-problem/tree/master/hackerrank/string-reduction –

+0

"baab"は "b"を生成しませんか? – chrisl08

答えて

1

whileループを使用する必要があります。コードに問題があるのは、コードを1回だけ繰り返すことです。最初の反復では、あなたの入力 "baab"は "bb"になりますが、第2のbをチェックし、i + 1に "b"を探します(これは存在しません)。 forループを以下のようにwhileループに変更します。

import java.util.Scanner; 
public class Solution{ 
public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    StringBuilder sb = new StringBuilder(scan.nextLine()); 
    int c=0; 

    while(c< sb.length()-1){ 
     if(sb.charAt(c) == sb.charAt(c+1)){ 
      sb.delete(c,c+2); 
      c=0; 
     } 
     else{ 
      c+=1; 
     } 
    } 
    if(sb.length() == 0) 
     System.out.println("Empty String"); 
    else 
     System.out.println(sb.toString()); 
} 

}

+0

私はコードを編集し、最初のbをもう一度チェックするようにループにi = 0を追加しました。あなたはそれをチェックしますか?それが有効なプロセスかもしれませんか? – john400

+0

サンプル入力0では機能しません。 – john400

+0

これを確認します。私に瞬間を与えてください。 –

1

問題は、文字列を一度ループするだけです。 例: 文字列 "baab"、 "aa"を削除してループを終了します。

解決策:フラグisNonReducibleを持つ再帰を使用し、空の文字列またはフラグを返すまでループします。isNonReducible = true;

public class Solution { 
public static StringBuilder checkReducible(StringBuilder sb) { 
    boolean isNonReducible = true; 
    for (int i = 0; i < sb.length() - 1; i++) { 
     if (sb.charAt(i) == sb.charAt(i + 1)) { 
      isNonReducible = false; 
      sb.delete(i, i + 2);  
     } 
    } 
    if (sb.length() == 0) { 
     return new StringBuilder("Empty String"); 
    } 
    else { 
     if(!isNonReducible) { 
      sb = checkReducible(sb); 
     } 
     return sb; 
    } 
} 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    StringBuilder sb = new StringBuilder(scan.nextLine()); 
    System.out.println(checkReducible(sb)); 
    scan.close(); 
} 
} 
+0

他のテストケースは正しく通過していますか? – john400

+0

あなたのコードは、文字列が1つの短縮可能な部分文字列しか持たない場合にはちょうど良いでしょう。 –

+0

ちょっとコードがうまくいきました。しかし、私はちょうどそれが働いていることを理解することができます。ありがとうございます。:) – john400

0

あなたはこれを試すlableの助けを借りて行うことができ、

public static void main(String[] args) { 
    boolean canReduce = true; 
    Scanner scan = new Scanner(System.in); 
    StringBuilder sb = new StringBuilder(scan.nextLine()); 


    startPoint: while (sb.length() > 0 && canReduce) { 
     for (int i = 0; i < sb.length() - 1; i++) { 
      if (sb.charAt(i) == sb.charAt(i + 1)) { 
       sb.delete(i, i + 2); 
       canReduce=true; 
       continue startPoint; 
      }else{ 
       canReduce=false; 
      } 

     } 
    } 

    if (sb.length() == 0) { 

     System.out.println("Empty String"); 
    } else { 

     System.out.println(sb.toString()); 
    } 
} 
0

はこれを試してみてください:

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    StringBuilder sb =new StringBuilder(in.nextLine()); 

    for (int i=0; i<sb.length()-1; i++){ 
     if(sb.charAt(i)==sb.charAt(i+1)){ 
      sb.delete(i, i+2); 
      i=-1; 

    } 
    } 
    if(sb.length()==0){ 
     System.out.println("Empty String"); 
    }else{ 
     System.out.println(sb); 
    } 
    } 
関連する問題