2016-06-27 2 views
1

次のコードは、2つの文字列に共通の部分文字列があるかどうかを確認するために使用されます。 No:7の行はどうしますか?説明してください。BIT操作を使用して2つの文字列に共通部分文字列があるかどうかを確認します。

1  #include<iostream> 
    2  using namespace std; 
    3  
    4  int letterBits(const string &s) { 
    5  int bits = 0; 
    6  for (char ch : s) 
    7   bits |= 1 << (ch - 'a'); 
    8  return bits; 
    10  } 
    11  
    12  int main() { 
    13   int testCases; 
    14   cin >> testCases; 
    15   while (testCases--) { 
    16    string strA, strB; 
    17    cin >> strA >> strB; 
    18    int bitsA = letterBits(strA); 
    19    
    20    int bitsB = letterBits(strB); 
    21    cout<<bitsB<<" "; 
    22    cout << (bitsA & bitsB ? "YES": "NO") << endl; 
    23   } 
    24   return 0; 
    25  } 
+0

Woeは、 '(ch - 'a')'に対して負の結果や大きすぎる結果を生成する文字列を入力した人は誰でも...これは良い方法ではありません。 –

+0

良いフォーマットと行番号をありがとう。 +1 –

+0

注意してください。行7のセマンティクスでは、 '<< '演算子はストリーム挿入ではなく、左シフト*です。 –

答えて

1

ライン7は、見つかった各文字の整数ビットにビットを設定しています。 (たとえば、文字が 'a'の場合はビット0、文字が 'b'の場合はビット1など)。

この方法では、2つの文字列に同じ文字があるかどうかを確認するだけなので、 "abc" == "cba"となります。

+1

実際には、2つの文字列に少なくとも1つの文字が共通しているかどうかをチェックします。これは、共通部分文字列を持つ別の方法です。たとえば、 "abc"と "axy"の答えはYESです。 –

+0

@IgorTandetnikので、文字の出現の順序に関係なく、それは共通の文字があるかどうかを見つけるだけですか? – Indhuja

+1

@Indhujaあなたはそれをテストして自分で確認してみませんか? –

関連する問題