【发布时间】:2011-12-12 12:13:12
【问题描述】:
我确信这个问题已经在 Stack Overflow 上多次讨论过。我只是想验证我的答案是否有效。我在thread 中看到了这个问题。很抱歉这篇文章与该主题重复,如果必须删除它,我会这样做。
我想以一种更简单的方式来做这件事。通过对字符串中的字符进行异或运算。
所以 O(n) 用于对每个字符进行异或,O(1) 用于比较两个字符串中的最后一个字符,这给出了 O(n) 解决方案。
即使最后一个字符可能是任何特殊符号,但如果字符串是字谜,它们最终仍然是相同的。我的逻辑是对的吗?
那么,可以采用这种解决方案来代替所有的排序和散列吗?我的代码是这样的:
char a[7] = "Length";
char b[7] = "enghtL";
for (int i = 1; i < 6; i++) {
a[i] = a[i] ^ a[i-1];
b[i] = b[i] ^ b[i-1];
}
if (a[5] == b[5]) {
cout << "\n The strings are anagrams";
}
else {
cout << "\n No they are not";
}
【问题讨论】:
-
根据您的程序,“ab”是“ef”的变位词。恐怕这种方法行不通。
-
所以,基本上,“是
((a XOR b XOR c) ≡ (c XOR a XOR b) ≡ (b XOR c XOR a) ≡ (c XOR b XOR a)) ∧ ((a XOR b) ≠ (a XOR d))∀a,b,c,d,以及在 arity 中的概括?”我认为不会。 -
@TonyK:哇! +1。没想到。
-
当我需要找字谜时,我只是将单词中的字母排序并检查结果是否相同。