设计一个比较器来命令单词,使每个单词的最后一个字母是下一个单词的第一个字母?

时间:2012-02-15 21:48:04

标签: java algorithm puzzle comparator words

好的,所以我有一个程序,其中有一部分我需要“订购单词,使列表中每个项目的最后一个字母是下一个项目的第一个字母,一个由一个链接在一起的单词链最后和第一封信。“

样本输入是狗,大象,长颈鹿,犀牛,老虎 正确的输出是狗,长颈鹿,大象,老虎,犀牛 而我的输出是老虎,犀牛,狗,长颈鹿,大象。

比较器是这样的:

class linkedSort implements Comparator {
    //will return 1 for a match
    //returns 0 if no match

    public int compare(Object t, Object t1) {
        char[] charArr1 = t.toString().toCharArray();
        char[] charArr2 = t1.toString().toCharArray();

        if (charArr1[charArr1.length - 1] == charArr2[0]) {
            return -1;
        } else {
            return 1;
        }
    }
}

任何帮助都会非常有用!!

4 个答案:

答案 0 :(得分:10)

使用简单的比较器和排序无法解决这个问题,因为比较没有定义 total order 。总订单是以下四个属性所包含的订单:

  • 反身性:x≤x始终为真。
  • 反对称:如果x≤y且x≠y,则y≤x永远不会为真。
  • 传递性:如果x≤y且y≤z,则x≤z
  • Totality :对于任何x和y,x≤y和y≤x中至少有一个成立。

您的订单不是全部订单。首先,它打破了反身性:例如,“a”≤“a”。其次,它打破了反对称性:“缓和”≤“前夕”和“前夕”≤“轻松”。第三,它打破了传递性:“东”≤“茶”和“茶”≤“aver”,但“东”≤“aver”是假的。最后,它不是完全的:“东”不小于“西”,“西”不小于“东”。

要解决此问题,您需要采用不同的方法。作为提示,您可能希望将问题视为图形,其中字母是节点,而单词是连接开始和结束字母的边。你能在这张图中找到一条只能访问每一条边的路径吗?

希望这有帮助!

答案 1 :(得分:3)

如果您希望使用sort执行此操作,则此操作无效。比较器需要对集合强加总排序,但您的要求不是这样的。

答案 2 :(得分:1)

这相当于这个问题:Detecting when matrix multiplication is possible

  1. 为每个字母创建一个节点
  2. 使用相应动物的有向边连接两个字母(允许同一对顶点之间有多个边)
  3. 找到Eularian小径

答案 3 :(得分:0)

Comparator方法不起作用。排序仅使用本地比较,但您的问题是全局“优化”。

为了说明,这里是Arrays.sort(array, comparator)的实际比较。请注意,某些掉期会破坏之前做出的正确选择,因为它们只具有本地知识。

start: dog,elephant,giraffe,rhinoceros,tiger

dog, elephant (swap)

-> elephant,dog,giraffe,rhinoceros,tiger

dog, giraffe (OK)

-> elephant,dog,giraffe,rhinoceros,tiger

giraffe, rhinoceros (swap)

-> elephant,dog,rhinoceros,giraffe,tiger

dog, rhinoceros (swap)

-> elephant,rhinoceros,dog,giraffe,tiger

elephant, rhinoceros (swap)

-> rhinoceros,elephant,dog,giraffe,tiger

giraffe, tiger (swap)

-> rhinoceros,elephant,dog,tiger,giraffe

dog, tiger (swap)

-> rhinoceros,elephant,tiger,dog,giraffe

elephant, tiger (OK)

-> rhinoceros, elephant, tiger, dog, giraffe