我想做两种排序,第一种排序如下:
给定一组不同的行,其中两个单词用空格分隔,按照下一行的第一个单词等于前一行的最后一个单词的顺序排列它们。例如:
应该给出类似的东西:
我将每一行都读成一个字符串,将其放在一个向量中并使用类似的排序比较函数:
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;
}
但为了获得欲望的结果,我必须排序两次。我不明白为什么会发生这种情况。
第二个排序标准是:
给定一组单词然后命令,以便下一个单词与前一个单词的最后一个字母具有相同的第一个字母。例如:
应该给出类似的东西:
我做了类似的事情,但似乎没有正常工作。
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];
}
如何使这两种排序工作正常?
答案 0 :(得分:2)
首先,问题#2可以简化为问题#1。将每个字符串替换为由第一个字母和最后一个字母组成的字符串,用空格分隔;例如AEIOU
变为A U
。然后很明显,在这些新字符串上解决问题#1也会解决原始字符串上的问题#2。
其次,这是在有向图中找到Hamiltonian path的问题。有问题的图形包含作为顶点的输入字符串,在X Y
和Y Z
形式的每对顶点之间绘制一条边。
如上所述,问题是不明确的:当图表不包含哈密尔顿路径时,不清楚什么被认为是正确的答案。您的示例有Pamela Luisa
后跟Pedro Luis
,但不符合要求。一种可能的解释是找到minimum path cover。
答案 1 :(得分:0)
可能有一种比这更好的方法,但我会首先查看所有单词并将它们分配给0到n的数字。
然后每一行都可以表示为一对有序的数字
然后,如果有k行,则创建一个(k x k)bool矩阵
如果该列中该对中的第二个单词与该行中该对中的第一个单词匹配,则每个位置都为true,否则为false。
那时你应该能够实现一个简单的回溯搜索来找到一些行序列(x_0,x_1,...),这样所有i的矩阵[x_i] [x_ {i + 1}] =为真。 />
希望有所帮助。
如果你能解决第一个问题,第二个问题应该非常相似。