2012-02-23 6 views
0

次は すなわち、 ABCは、私がチェックをしたAXZサブストリングの比較です

と同じABXまたはAXCまたはXBCと同じですが、ではない[最大つのミスマッチを持つ文字列Aと文字列Bを比較するためのコードですいくつかのケースがありますが、ウェブサイトは間違った答えを提供しています。誰かがこのコードがどこで失敗するかを理解するのに役立つでしょうか? また、誰かが同じ問題に対してより良いアルゴリズムを提供できると嬉しいです。

TY

int compare(string a, int pos, string b) { 
int count = 0; 
int length = b.length()-1; 
int mid = b.length() /2; 

if(pos+length >= a.length()) 
    return 0; 

for(int i=0,j=pos;i<=mid;i++,j++) {  
    if(i == mid) { 
     if(a[j] != b[i]) 
      count ++; 
    } 
    else { 
     if(a[j] != b[i]) 
      count ++; 
     if(a[pos+length - i] != b[length -i]) 
      count ++; 
    } 
    if(count >= 2) return 0; 
} 
return 1; 
} 
+3

宿題のような匂い。 – Till

+0

宿題はしていませんが、プログラミングウェブサイト – Rama

+0

宿題をここで議論するのはどうですか? – jogojapan

答えて

1

一つの問題は、b.length()が偶数の場合、その後、あなたはa[pos + b.length()/2]二回b[b.length()/2]に比較することです:一度ときi == mid - 1、一度i == midとき。したがって、compare("abcd", 0, "abbd")のようなものは、を返します。これは、'c' -vs.- 'b'の矛盾を2つの別個のミスマッチとしてカウントするためです。

midに関連するすべてのロジックを削除することをお勧めします。あなたのコードを大いに複雑にする以外の目的はありません。 0からb.length() - 1にまっすぐ反復すると、ずっと良いでしょう。

+0

それだけでなく、2つのバッファの両端から一度に作業する現在のアクセスパターンは、ホーリードなキャッシュ動作をします。 –

+0

@BenVoigt:本当ですが、私は本当にそれがここで最も問題ではないと思います。ダブルエンドアプローチに正当な理由があった場合、そのキャッシュの振る舞いは、その理由を克服するのに十分かもしれません。何の理由もないように思われるので、私はそれが疑問だと思う。 – ruakh

+0

ありがとうRuakh ...私はそれを解決しました より大きい入力のために私のコードがより速く動くことを望む中間ロジックを置く必要がありました しかし、私はこのナイーブを最適化するのではなく新しいアルゴリズムを探す必要があるようです(N * N)時間を使用する方法 より少ない時間を使用するこの操作のより良いアプローチを提案できますか? TY – Rama