1

我必须用 c++ 编写一个程序,它返回循环图中的对称轴数。当左侧相对顶点或边之间的值是右侧值的镜像时,循环图具有对称轴。对称轴可以与顶点和边相交。

例如:

在此处输入图像描述

有什么方法可以比这更快O(n^2)吗?

4

1 回答 1

2

nm 的答案实际上几乎是正确的,但无论如何都不是。

让我们将其中一个节点称为起始节点和轴,传递起始节点,即主轴。在某个轴上翻转图形等于在主轴和旋转上翻转:

图 1

旋转后,主节点可以放置在任何其他节点位置(我们也总是可以找到当前轴来执行此操作)。

如果我们将图存储为字符串,则由反向字符串描述的翻转图循环移位 0 到 N-1 个位置。这些字符串的相等意味着图形的相等。显然,这样的匹配数等于两次重复图的字符串中反转字符串的出现次数:

图二

所以是的,KMP 用 O(N) 复杂度来解决问题。

但是你应该避免 str 等于 reverse(str) 的情况,因为 match 将同时计算 0 和 N 移位,尽管它们描述了相同的轴。因此,您不应该使用 str 和其自身的串联,而应仅使用此串联的前 (2*N – 1) 个字符来在任何情况下实现正确的行为。

于 2015-12-16T11:53:36.840 回答