我该如何排列?

时间:2018-10-02 06:11:49

标签: c++ permutation

我正在实施一个游戏,玩家可以提出建议,并且计算机应返回分数最高的单词。 为此,我应该从一个单词开始,然后从该单词开始添加字母(1到7),以创建一个存在的新单词。

示例:

  • 字词:
  • 字母:y,m,s,i,r,e,s
  • 可能的新词:他们,他们,他们在那里,论文,Therms等。

这个想法是找到所有可能的排列,然后检查每个单词是否在字典中。我已经安装了词典,并且知道如何检查单词,但是不知道如何找到字谜。 事实是,我必须检查所有可能的单词,并且它们的大小可能不同,并且其中一些不包括所有字母。

3 个答案:

答案 0 :(得分:1)

为什么不使用内置算法?

此页面甚至还提供了一个示例供您使用。

https://en.cppreference.com/w/cpp/algorithm/next_permutation

只需遍历所有排列,在'the'前面加上并在字典中查找即可。

答案 1 :(得分:1)

您需要所有可能大小的字母的所有排列。您可以对字母进行置换,并在大小之间循环,并在单词前添加前缀。

E。 g。

字词:

字母:y,m,s,i,r,e,a

  • 第一置换y,m,s,i,r,e,a

    • 大小1 =>他们
    • size 2 => theym
    • ...
  • 第二个排列m,y,s,i,r,e,a

    • 大小1 =>他们
    • size 2 => themy
    • ...

这是一个例子

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main() {
    std::string word{"the"};
    std::string letters{"ymsirea"};
    std::sort(letters.begin(), letters.end());
    do {
        for (std::size_t i(1); i <= letters.length(); ++i) {
            std::cout << word << letters.substr(0, i) << std::endl;
        }
    } while (std::next_permutation(letters.begin(), letters.end()));

    return 0;
}

另一种解决方案是在诸如\n之类的字母上添加特殊符号并对其进行置换。然后比较新词,直到特殊符号

字词:

字母:y,m,s,i,r,e,a,\ 0

  • 第一个置换y,\ 0,m,s,i,r,e,a =>他们
  • 第二个置换y,m,\ 0,s,i,r,e,a => theym

这里是一个例子:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main() {
    std::string word{"the"};
    std::string letters{"ymsirea\n"};
    std::sort(letters.begin(), letters.end());
    do {
        std::size_t pos = letters.find('\n');
        if (pos > 0)
            std::cout << word << letters.substr(0, pos) << std::endl;
    } while (std::next_permutation(letters.begin(), letters.end()));

    return 0;
}

这两种算法都会生成许多重复项。两种算法都会生成多达(n)!* n个单词,其中n是字母数。在此示例中,它将产生7 * 6 * 5 * 4 * 3 * 2 * 7 = 35280个字。如果字母重复,则std :: next_permutation将跳过某些排列。您可以使用一组过滤重复项。最多只能有7 + 7 * 6 + 7 * 6 * 5 + 7 * 6 * 5 * 4 + 7 * 6 * 5 * 4 * 3 + 7 * 6 * 5 * 4 * 3 * 2 = 8659如果所有字母都是唯一的,则使用不同的单词。因此,该算法最多可产生35280-8659 = 26621个重复项。

对于排列,您可以使用std::next_permutation

答案 2 :(得分:0)

查找字谜很简单,因为每个单词都将一个与单词相同的键与其字母排序相关联。例如:orange -> aegnor。然后创建一个字典,该字典的键是先前定义的键,其值是具有此键的单词列表。

现在,对于您添加到输入单词中的每个字母,对单词进行排序以生成键,然后在该词典中找到与此新键相关的所有字谜。

例如,词典将包含:

dict["aegnor"] -> [ "orange", "organe" ]

示例:

input: "the"

First pass:
Key = "eht"
dict["eht"] -> [ "the" ]

Second pass, we add the letter 'm':
Key = "ehmt"
dict["ehmt"] -> [ "meth", "them" ]

...