找出字符串是否是字谜 - 重访

时间:2011-10-21 11:07:16

标签: c++ algorithm

我确信在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";
}

4 个答案:

答案 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;