假设没有重音字母并忽略大小写,对于每个单词,您可以将一个位字段存储在一个 32 位整数中,如果来自 az 的相应字母存在,则位 0-25 设置为 1。
整数可以像这样在线性时间内计算:
int getBitField(char* word)
{
int bits = 0;
while(*word)
bits |= 1 << ((*word++) - 'a');
return bits;
}
如果假设单词是英语或其他语言中的单词,并且具有最大单词长度,那么恒定时间和线性时间之间的差异是相当没有意义的,因为(为了论证)所有小于最大长度的单词都可以被填充与不匹配的字符,这将导致一个恒定的时间算法。
一旦有了两个单词的位字段,您可以通过将它们组合在一起并检查结果是否不为零(这表示没有共同的字母)而不是 2 的幂(这将仅指示一个共同的字母,因为仅设置了一个位)。您可以通过将一个数字与自身减去 1 进行与运算来测试 2 的幂。
bool is2Consistent(int word1bits, int word2bits)
{
int common = word1bits & word2bits;
return (common & (common - 1)) != 0;
}
如果您打算将重复字母的单词定义为 'meet' 和 'beef' 为 2-consistent,这将不起作用。
如果你想测试 3-consistency,你只需要在函数中添加一行:
bool is3Consistent(int word1bits, int word2bits)
{
int common = word1bits & word2bits;
common &= (common - 1);
return (common & (common - 1)) != 0;
}
将一个整数与自身减一相加只会删除最低有效位,因此您可以应用它任意次数来测试 4 一致性、5 一致性等。