排序这些单词的排序标准

Sorting criteria for ordering this words?

本文关键字:排序 标准 单词      更新时间:2023-10-16

我想做两种类型的排序,第一种如下:

给定一组不同的行,其中两个单词用空格分隔,以下一行的第一个单词等于前一行的最后一个单词的方式排列它们。例如:

  • 帕梅拉•路易莎
  • 路易斯·安琪儿
  • 佩德罗Luis
  • 路易莎Elianny
  • 天使佩德罗
  • Elianny帕梅拉

应该像这样:

  • 路易莎Elianny
  • Elianny帕梅拉
  • 帕梅拉•路易莎
  • 佩德罗Luis
  • 路易斯·安琪儿
  • 天使佩德罗

我读取每一行作为一个字符串,把它放在一个向量和使用排序比较函数,像这样:

bool cmp(std::string a, std::string b)
{
    std::string prb = a.substr(a.find(" ")+1),
                prb2 = b.substr(0, b.find(" "));
    return prb == prb2;
}

但是为了得到想要的结果,我必须排序两次。我不明白为什么会这样。

第二个排序条件是:

给出一组单词顺序,使下一个单词的首字母与前一个单词的最后一个字母相同。例如:

  • EO
  • UIU
  • 五个母音字母

应该像这样:

  • 五个母音字母
  • UIU
  • EO

我做了类似的事情,但似乎不正常工作。

bool cmp(std::string a, std::string b)
{
    if(b[b.size()-1] == a[0] && a[0] != b[0]) return false;
    return b[b.size()-1] == a[0];
}

我怎样才能使这两个排序工作良好?

首先,问题2可以简化为问题1。将每个字符串替换为由第一个字母和最后一个字母组成的字符串,以空格分隔;例如,AEIOU变成A U。那么很明显,在这些新字符串上解决问题#1也将给出在原始字符串上解决问题#2的方法。

第二,这是一个在有向图中寻找哈密顿路径的问题。所讨论的图由输入字符串作为顶点组成,在形式为X YY Z的每对顶点之间绘制一条边。

这个问题,如前所述,是不明确的:当图不包含哈密顿路径时,不清楚什么是正确的答案。您的示例中Pamela Luisa后跟Pedro Luis,这不满足要求。一种可能的解释是寻找最小路径覆盖。

可能有比这更好的方法,但我将首先遍历所有单词并为它们分配数字0到n。
然后每行可以表示为有序的数字对。
然后,如果有k条线,则创建一个(k x k)的bool矩阵。
在每个位置上,如果该列的第二个单词与该行的第一个单词匹配,则设置为true,否则设置为false。
此时,您应该能够实现一个简单的回溯搜索,以找到一些行序列(x_0, x_1,…),使得矩阵[x_i][x_{i+1}]对所有i = true。
希望这对你有帮助。如果你能解决第一个问题,第二个问题应该是非常相似的。