【问题标题】:Finding whether strings are anagrams - Revisited查找字符串是否是字谜 - 重访
【发布时间】: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。没想到。
  • 当我需要找字谜时,我只是将单词中的字母排序并检查结果是否相同。

标签: c++ algorithm


【解决方案1】:

很抱歉,这行不通。

当然,如果它是一个字谜,代码(如果它工作正常)会这样说,但你也会有很多“误报”,因为几个(不同的)字符串可以产生相同的输出。

【解决方案2】:

您正在将有关 n 字节字符串的所有信息压缩为单个字节 - 实际上是一个非常基本的散列。每当您在两个不是字谜的字符串之间发生哈希冲突时,您都会返回误报。

如果您需要 O(n) 方法来查找字谜,请使用计数排序对单词进行排序,然后比较结果是否相等。

【讨论】:

    【解决方案3】:

    此代码作为解决方案的一部分可能很有用。

    我的做法是:

    检查两个单词的字母数量是否相同,如果不是,则不能是字谜。 然后将字母或每个单词按字母(或任何其他)顺序排序 遍历单词列表,如果字母不相等则返回 false。

    【讨论】:

      【解决方案4】:

      在 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;
      

      【讨论】:

      • 这仅适用于反向字符串,这只是可能的字谜的负载之一。
      • @TomalakGeret'kal 你是对的,当然,我对字谜的定义感到困惑。
      猜你喜欢
      • 2021-10-10
      • 2016-03-21
      • 2013-10-26
      • 2016-04-07
      • 2015-05-30
      • 2021-01-11
      • 2019-05-02
      相关资源
      最近更新 更多