2017-09-11 11 views
1

問題: を繰り返し、文字列sからサブtを削除し、同じことを行うために必要な手順の数を印刷します。文字列から部分文字列を削除し、繰り返し

説明/ワーキング:

例:t = abs = aabb。最初のステップでは、tがに含まれる であるかどうかを確認します。ここでは、tが中間に含まれています。つまり、a(ab)bです。 それを削除し、結果はabになり、 countの値が1だけ増えます。tsに含まれているかどうかを再度確認します。今、tは となり、sとなります。つまり、(ab)となります。そこで、それをsから削除し、 countを増やします。したがって、tsに含まれていないため、 countの値を停止して印刷します。この値は2です。私はちょうどHackerrankに9/14のテストケースに合格することができています

static int maxMoves(String s, String t) { 
    int count = 0,i; 

    while(true) 
    { 
     if(s.contains(t)) 
     { 
      i = s.indexOf(t); 
      s = s.substring(0,i) + s.substring(i + t.length()); 
     } 
     else break; 

     ++count; 
    } 

    return count; 
} 

  1. コード1:だから、ここで私が試したもの

をです何らかの理由で(「間違った回答」症例)。しばらくすると、Javaにreplace()というメソッドがあることがわかりました。だから、私はifの条件を置き換えることでそれを使用しようとし、2番目のバージョンのコードを考え出しました。

  • コード2:

    static int maxMoves(String s, String t) { 
        int count = 0,i; 
    
        while(true) 
        { 
         if(s.contains(t)) 
          s.replace(t,""); //Marked Statement 
         else break; 
    
         ++count; 
        } 
    
        return count; 
    } 
    

    しかし、いくつかの理由で(私はなぜ知らない)、上記のコードで"と記された書"が無限に実行されます(この私が気づきました「告知された声明」System.out.println(s.replace(t,""));に置き換えたとき。私は同じ理由がありません。

  • 、私は9/14のテストケースを渡しておりますので、「間違った回答」につながっているいくつかの論理的な誤りがなければなりません。 コード1を使用すると、どのように克服できますか? コード2を使用した場合、「マークされた声明」の無限実行を避けるにはどうすればよいですか?または私にコード3を提案したい人はいますか?

    は、事前にありがとう:)

    +0

    、その部分文字列 'の両方のインデックス()' 0ですか? –

    +0

    sまたはtの空文字列があるとどうなりますか? –

    +0

    次のようなケースを考えてください。 "" .replace( ""、 "")?これはこれで終わりでしょうか? –

    答えて

    2

    はそれを無視するのではなく、新しい(返された)文字列を保存してください。

    s = s.replace(t,""); 
    

    を置き換えるには、新しい文字列を返します。指定された文字列をインプレースで変更すると思ったようです。

    +0

    今私は3/14のケースだけを渡すことができます:( –

    0

    文字列の簡単なパラメータチェックを追加してみてください。文字列がnullに等しくすべきではないと彼らはあなたがは、コード内の 1. でエッジケースに欠落している可能性があり0

    static int maxMoves(String s, String t) { 
        int count = 0,i; 
    
        if(s == null || s.length() == 0 || t == null || t.length() == 0) 
         return 0; 
    
        while(true) 
        { 
         if(s.contains(t) && !s.equals("")) 
          s = s.replace(t,""); //Marked Statement 
         else break; 
    
         ++count; 
        } 
    
        return count; 
    } 
    
    0

    より大きいカウントを可能にするために0よりも大きい長さを持つべきですコード2、置換文字列の後に新しい文字列が格納されていません。 replace関数は、リテラルターゲットシーケンスに一致するこの文字列の各部分文字列を、指定されたリテラル置換シーケンスに置き換えます。

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

    public static int findCount(String s, String t){ 
    
        if(null == s || "" == s || null == t || "" == t) 
         return 0; 
        int count =0; 
        while(true){ 
         if(s.contains(t)){ 
          count++; 
          int i = s.indexOf(t); 
          s = s.substring(0, i)+s.substring(i+t.length(), s.length()); 
          // s = s.replace(t,""); 
         } 
         else 
          break; 
        } 
    
        return count; 
    } 
    
    文字列が先頭にある場合、何が起こる
    関連する問題