【问题标题】:Designing a comparator to order words so that the last letter of each word is the first letter of the next word?设计一个比较器来排序单词,以便每个单词的最后一个字母是下一个单词的第一个字母?
【发布时间】:2012-02-15 21:48:03
【问题描述】:

好的,所以我有一个程序,其中有一部分我需要“对单词进行排序,使得列表中每个项目的最后一个字母是下一个项目的第一个字母,一种通过以下方式链接在一起的单词链最后一个和第一个字母。”

样本输入为dog,elephant,giraffe,rhinoceros,tiger 正确的输出是dog,giraffe,elephant,tiger,rhinoceros 而我的输出是老虎、犀牛、狗、长颈鹿、大象。

比较器是这样的:

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;
        }
    }
}

任何帮助将不胜感激!

【问题讨论】:

  • 您的第一个问题是您的 cmets 说返回 1 或 0,而该方法返回 -1 或 1。另外,正如 @SLaks 所说,请描述您尝试过的内容以及它如何意外失败/执行.

标签: java algorithm puzzle comparator words


【解决方案1】:

你不能用一个简单的比较器和一个排序来解决这个问题,因为比较没有定义一个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”。其次,它打破了反对称:“ease”≤“eve”和“eve”≤“ease”。第三,打破及物性:“east”≤“tea”,“tea”≤“aver”,但“east”≤“aver”为假。最后,不全:“east”不小于“west”,“west”不小于“east”。

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果您希望使用sort 执行此操作,那么这将不起作用。比较器需要对集合施加总排序,但您的要求不是这样的。

    【讨论】:

      【解决方案3】:

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

      1. 为每个字母创建一个节点
      2. 用对应动物的有向边连接两个字母(允许同一对顶点之间有多个边)
      3. 寻找欧拉人的踪迹

      【讨论】:

      • 我不认为他的图是欧拉图。我认为他想要一个访问每个单词一次的哈密顿回路(但是,如果单词轨迹的结尾不需要连接到单词轨迹的开头,那么他需要最长的路径不使用相同的节点两次,其中单词是节点)
      • @robertking 这取决于你如何制定它。如果将单词表述为节点,则需要找到哈密顿回路,这是一个 NP 完全问题。如果将单词表述为边,则需要找到接近线性时间的欧拉路径。
      • 我明白了,你说的是欧拉小径而不是欧拉环。我仍然认为您不需要遍历所有边缘。例如"ant,antelope, ,toad,enigma", enigma 对 ant 和 antelope 都有优势,但您只能使用其中一个优势
      • @robertking 再一次,我不是在词之间画边,但词本身就是边。例如。 ant=> edge between 'a' and 't' , antelope => edge between 'a' and 'e' ... 等等。在最后的路径中,您需要拥有所有单词=> 所有边缘。
      • @robertking 是的。这就是为什么你应该允许同一组顶点之间有多个边。如果您不想这样做,则使用临时顶点,复杂度将保持不变。
      【解决方案4】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多