2016-07-18 22 views
1

最初の文字列にある2番目の文字列から文字を削除するプログラムを作成しました。複雑さはBigO(n^2)になります。複雑さをさらに減らすことはできますか?最初の文字列にある2番目の文字列の文字を削除します。

public class Tmp { 

    public static void main(String[] args) { 
     String s = "halloween"; 
     String s1 = "halcyon"; 
     char[] ss = s.toCharArray(); 
     char[] ss1 = s1.toCharArray(); 

     for(int i=0;i<ss.length;i++){ 
      for(int j=0;j<ss1.length;j++){ 
       if(ss1[j] == ss[i]){ 
        ss1[j] = 'x'; //Replace the common char with x 
       } 
      } 
     } 
     System.out.println(Arrays.toString(ss1)); 
    } 
} 

OUTPUT

[x, x, x, c, y, x, x] 
+1

あなたのコードをコードレビューに入れて、より良い結果を得ることができます。 http://codereview.stackexchange.com/ –

+0

はい、それを 'O(n log n)'に減らすことができます。 –

+1

string1のすべての文字をセット( 'O(n)')に追加します。次に、string-2の各文字について、set-1で 'contains()'を使用し、そのcharがあれば 'x'に設定します( 'O(n)') – TheLostMind

答えて

2
  1. 最初の文字列をマップに変換します。他の文字列上のO(N)
  2. 反復ステップ1 O(N)からマップに存在文字+ O(1)

合計時間複雑度= O(N)

かどうかを確認ここでは、MAPを格納するためのスペースがさらに複雑になります。

+0

最初の文字列をマップO(N)に変換しても問題ありませんが、他の文字列を繰り返してマップをチェックしてもO(N)になります。 O(N)+ O(N) – underdog

+1

はい2つの異なるループが存在するため、合計複雑度はO(N)+ O(N)であり、2 * O(N)になります。ここで2は定数であり、非常に大きいNに対しては2を無視することができる。したがって、最終的な複雑さはO(N)になる。 –

2
あなたは(2番目の文字列には、重複する文字が存在しない場合)HashSetのに2番目の文字列を変換するために選択することができます

。次に、ハッシュマップの最初の文字列から各文字の存在を確認し、見つかった場合は削除します。

文字列をトラバースするためのO(N)複雑さと、HashSetのput/getの複雑さはほぼO(1)です。

+0

* first * stringマップし、次にマップ内にある2番目の文字列から文字を削除します。重複した文字はそのようにサポートされています。 – Andreas

1

ソース文字列のすべての文字が小文字の場合は、サイズが26のブール値配列を使用できます。 文字列が最初から最後までスキャンし、文字が存在する場合はboolean配列を更新します。 次に、ターゲット文字列をスキャンし、boolean配列がソース配列内にあるかどうかをチェックします。

複雑さは両方の文字列の長さの合計に等しくなります。

+0

'文字が存在する場合'には複雑さO(n)があります。今度は全体の複雑さはO(n^2)です –

関連する問題