アクセントのない文字を想定し、大文字の使用を無視すると、各単語について、32 ビット整数のビット フィールドを格納できます。az の対応する文字が存在する場合、ビット 0 ~ 25 が 1 に設定されます。
整数は、次のように線形時間で計算できます。
int getBitField(char* word)
{
int bits = 0;
while(*word)
bits |= 1 << ((*word++) - 'a');
return bits;
}
単語が英語またはその他の言語の単語であり、最大単語長があると想定される場合、(議論のために) 最大長よりも短いすべての単語を埋め込むことができるため、一定時間と線形時間の違いはほとんど意味がありません。一定時間アルゴリズムになります。
2 つの単語のビット フィールドを取得したら、それらを AND 演算し、結果がゼロではないか (共通の文字がないことを示します)、2 のべき乗 (つまり、 1 つのビットのみが設定されているため、1 つの文字のみが共通であることを示します)。2 の累乗は、数値とそれ自体から 1 を引いた値の AND をとることでテストできます。
bool is2Consistent(int word1bits, int word2bits)
{
int common = word1bits & word2bits;
return (common & (common - 1)) != 0;
}
これは、'meet' や 'beef' のように文字が繰り返される単語を 2-consistent として定義する場合には機能しません。
3 つの一貫性をテストする場合は、関数に次の行を追加するだけです。
bool is3Consistent(int word1bits, int word2bits)
{
int common = word1bits & word2bits;
common &= (common - 1);
return (common & (common - 1)) != 0;
}
整数とそれ自体から 1 を引いた値の AND を取ると、最下位ビットが削除されるだけなので、任意の回数適用して 4 一貫性、5 一貫性などをテストできます。