我确信在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";
}
答案 0 :(得分:6)
我很抱歉,但这不起作用。
当然,如果它是一个字谜,代码(如果它正常工作)会这样说,但你也会有很多'误报',因为几个(不同的)字符串可以产生相同的输出。
答案 1 :(得分:1)
你将所有关于n字节字符串的信息压缩成一个字节 - 实际上是一个非常基本的哈希。每当你得到两个不是字母的字符串之间的哈希冲突时,你就会返回误报。
如果您想要一种O(n)方法来查找字谜,请使用计数排序对单词进行排序,然后比较结果是否相等。
答案 2 :(得分:0)
此代码可能是解决方案的一部分。
我的方法是:
检查这两个单词是否具有相同数量的字母,如果没有,那么它不能是字谜。 然后将字母或每个单词排序为字母(或任何其他)顺序 逐步执行单词列表,如果字母不相等则返回false。
答案 3 :(得分:-1)
在C ++中,您可以使用字符串反向迭代器:
std::string s1 = "Length";
std::string s2 = "htgneL";
std::string s3 = "htgnel";
if (s1 == std::string(s2.rbegin(), s2.rend()))
std::cout << "s1 and s2 are anagram" << std::endl;
else
std::cout << "s1 and s2 aren't anagram" << std::endl;
if (s1 == std::string(s3.rbegin(), s3.rend()))
std::cout << "s1 and s3 are anagram" << std::endl;
else
std::cout << "s1 and s3 aren't anagram" << std::endl;