当前位置: 首页 > 面试题库 >

一种确定两个字符串是否互为字谜的可能算法?

陶博涉
2023-03-14
问题内容

我有这个想法(使用C语言)来检查两个由ASCII字母组成的字符串是否彼此相同的字谜:

  1. 检查字符串长度是否相同。

  2. 检查两个字符串的所有字符的ASCII值之和是否相同。

  3. 检查两个字符串的所有字符的ASCII值的乘积是否相同。

我相信,如果所有这三个都是正确的,则字符串必须是彼此的字谜。但是,我无法证明这一点。有人可以帮助我证明或否认这可行吗?

谢谢!


问题答案:

我写了一个快速程序,强力搜索的冲突,并发现此方法确实
总是工作。字符串ABFN和AAHM具有相同的ASCII和和乘积,但不是彼此的字词。它们的ASCII总和为279,ASCII乘积为23,423,400。

冲突比这还多。我的程序搜索了所有长度为四的字符串,发现了11,737个冲突。

作为参考,这是C ++源代码:

#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;

int main() {
  /* Sparse 2D table where used[sum][prod] is either nothing or is a string
   * whose characters sum to "sum" and whose product is "prod".
   */
  map<int, map<int, string> > used;

  /* List of all usable characters in the string. */
  vector<char> usable;
  for (char ch = 'A'; ch <= 'Z'; ch++) {
    usable.push_back(ch);
  }
  for (char ch = 'a'; ch <= 'z'; ch++) {
    usable.push_back(ch);
  }

  /* Brute-force search over all possible length-four strings.  To avoid
   * iterating over anagrams, the search only explores strings whose letters
   * are in increasing ASCII order.
   */
  for (int a = 0; a < usable.size(); a++) {
    for (int b = a; b < usable.size(); b++) {
      for (int c = b; c < usable.size(); c++) {
        for (int d = c; d < usable.size(); d++) {
          /* Compute the sum and product. */
          int sum  = usable[a] + usable[b] + usable[c] + usable[d];
          int prod = usable[a] * usable[b] * usable[c] * usable[d];

          /* See if we have already seen this. */
          if (used.count(sum) &&
              used[sum].count(prod)) {
            cout << "Conflict found: " << usable[a] << usable[b] << usable[c] << usable[d] << " conflicts with " << used[sum][prod] << endl;
          }

          /* Update the table. */
          used[sum][prod] = string() + usable[a] + usable[b] + usable[c] + usable[d];
        }
      }
    }
  }
}

希望这可以帮助!



 类似资料:
  • 问题内容: 在Java中,有没有一种方法可以确定字符串的第一个字符是否为数字? 一种方法是 并一直执行到9点,但这似乎效率很低。 问题答案: 请注意,这将允许使用 任何 Unicode数字 ,而不仅仅是0-9。您可能更喜欢: 或较慢的正则表达式解决方案: 但是,使用这些方法中的任何一种,必须首先确保该字符串不为空。如果是,而且将引发。没有这个问题。 要使整个条件只占一行,并避免长度检查,可以将正则

  • 我的问题是,在这段代码中,最初我们将boolean isAnagram设为false,然后设置条件,但是我们得到的结果是错误的。因为很清楚,它们不是anagram,但是代码输出是“anagram”。

  • 我在练习面试问题,其中一个问题是:“实现一个算法来确定字符串是否具有所有唯一的字符”。 但我的问题是:如果我们假设string可以包含象形文字符号或任何东西(代码点大于u+ffff...?),那么该如何解决。 所以,如果我理解的正确,我可以很容易地想到解决方案,如果给定的字符串包含的字符属于从u+0000到u+ffff的字符集--它们可以转换成16位char,但如果我遇到一个字符的代码点大于u+f

  • 问题内容: 我正在通过将字符串转换为BSON进行MongoDB查找。在转换之前,有没有办法让我确定我拥有的字符串是否是Mongo的有效ObjectID? 这是我当前的findByID函数的脚本。效果很好,但是如果我确定字符串不是ID,我想按其他属性查找。 问题答案: 我发现猫鼬的ObjectId验证程序可用来验证有效的objectId,但我发现了一些无效ID被视为有效的情况。(例如:任意12个字符

  • 问题内容: 上下文:我是CS n00b,正在通过“破解编码面试”来完成自己的工作。第一个问题要求“实施一种算法以确定字符串是否具有所有唯一字符”。我的(可能是幼稚的)实现如下: 作者建议以下实现: 是什么使作者的实现比我的更好(FWIW,作者的解决方案是在Java中,我将其转换为Python -我的解决方案是无法在Java中实现的解决方案)吗?或者,更一般而言,解决该问题需要什么?我采用的方法有什

  • 问题内容: 我编写了两个简单的函数来确定字符串是否是回文。我以为它们是等效的,但是2不起作用。为什么是这样? 1个 2 问题答案: 不会创建字符串,而是创建“反向”对象: 因此,字符串不等于object 。为了使它起作用,您需要确保实际评估了该对象: 所述插入件在每个字符串中的字符,并且这导致反转串之间正在变成一个字符串对象。

  • 本文向大家介绍C ++中的元字符串(检查一个字符串交换后两个字符串是否可以相同),包括了C ++中的元字符串(检查一个字符串交换后两个字符串是否可以相同)的使用技巧和注意事项,需要的朋友参考一下 在本节中,我们将看到如何检查两个字符串是否为元字符串。元字符串是非常相似的那些字符串。如果我们在一个字符串中交换两个元素,那么它将与另一个字符串匹配。假设两个字符串是“ HELLO”和“ OELLH”,则

  • 问题内容: 我需要能够使用Java中的字符串,并确定其中包含的所有字符是否都在指定的字符集中(例如ISO-8859-1)。我已经到处寻找了一种简单的方法(包括使用来玩),但是还没有找到任何东西。 取得字符串并确定所有字符是否都在给定字符集中的最佳方法是什么? 问题答案: 类CharsetEncoder在包java.nio.charset中提供的方法canEncode是否支持一个特定的字符来测试。