有一些底层结构可以用来在 O(n) 时间内解决这个问题。
给出的规则是(大部分)定义数学群的规则,特别是 D_2 群,有时也称为 K(Klein 的四群)或 V(Viergruppe 的德语四群)。 D_2 是具有四个元素 A、B、C 和 1(标识元素)的组。 D_2 的实现之一是具有三个不同边的矩形框的对称集。 A、B 和 C 是围绕每个轴旋转 180 度,1 是恒等旋转(无旋转)。 D_2 的组表是
|1 A B C
-+-------
1|1 A B C
A|A 1 C B
B|B C 1 A
C|C B A 1
如您所见,规则与问题中给出的规则相对应,只是涉及1的规则在问题中不存在。
由于D_2是一个群,它满足一些规则:闭包(群中任意两个元素的乘积是另一个元素),关联性(意思是@ 987654322@ 用于任何元素x、y、z;即字符串减少的顺序无关紧要),存在身份(有一个元素1这样1*x=x*1=x 对于任何x),并且存在逆向(对于任何元素x,都有一个元素x^{-1} 使得x*x^{-1}=1 and x^{-1}*x=1;在我们的例子中,每个元素是它自己的逆)。
还值得注意的是,D_2 是可交换的,即x*y=y*x 对应于任何x,y。
给定 D_2 中的任何元素字符串,我们可以以贪婪的方式将组中的单个元素缩减为单个元素。例如,ABCCCCCCC=CCCCCCCC=CCCCCC=CCCC=CC=1。注意我们不写元素1,除非它是字符串中唯一的元素。关联性告诉我们操作的顺序无关紧要,例如,我们可以从右到左工作或从中间开始并得到相同的结果。让我们从右边尝试:ABCCCCCCC=ABCCCCC=ABCCC=ABC=AA=1。
问题的情况不同,因为涉及1的操作是不允许的,所以我们不能只消除对AA、BB或CC。然而,情况并没有那么不同。考虑字符串ABB。在这种情况下我们不能写ABB=A。但是,我们可以使用A 分两步消除BB:ABB=CB=A。由于操作顺序与关联性无关,因此我们保证得到相同的结果。所以我们不能直接从ABB 到A 但我们可以通过另一条路线得到相同的结果。
只要字符串中至少有两个不同的元素,就可以使用这种备用路由。特别地,在ABB、ACC、BAA、BCC、CAA、CBB、AAB、AAC、BBA、CCA57@3中的每一个中CCB,我们可以假设我们有减少xx=1,然后删除1。
因此,可以通过删除双字母来减少任何不齐次(不是所有相同字母)并且具有双字母子字符串(AA、BB 或 CC)的字符串。仅包含两个相同字母的字符串无法进一步缩减(因为问题中不允许使用1),因此假设任何非同质字符串都可以缩减为A、B 似乎是安全的,C,AA,BB,CC。
然而,我们仍然必须小心,因为 CCAACC 可以通过删除中间对 AA 变成 CCCC,但这不是我们能做的最好的事情:CCAACC=AACC=CC or AA 将我们带到长度为 2 的字符串。
我们必须注意的另一种情况是AABBBB。这里我们可以去掉AA,以BBBB结尾,但最好先去掉中间的B,然后再去掉:AABBBB=AABB=AA or BB(两者都相当于组内的1,但可以'不会在问题中进一步减少)。
还有另一个有趣的情况:AAAABBBB。盲目消除对将我们带到AAAA 或BBBB,但我们可以做得更好:AAAABBBB=AAACBBB=AABBBB=AABB=AA or BB。
以上表明,盲目消除双打不一定是前进的方式,但它仍然是有启发性的。
相反,字符串最重要的属性似乎是非同质性。如果字符串是同质的,停止,我们无能为力。否则,如果可能,确定一个保留非同质性属性的操作。我断言,如果字符串是非同质的并且长度为 4 或更大,则始终可以识别出保持非同质性的操作。
证明:如果一个 4 子串包含两个不同的字母,则可以在两个不同字母之间的边界处引入第三个字母,例如,AABA 转到 ACA。由于原始字母中的一个或另一个必须在字符串中的某处保持不变,因此结果仍然是非齐次的。
假设我们有一个 4 子字符串,它具有三个不同的元素,比如AABC,外部两个元素不同。那么如果中间两个元素不同,就对它们进行操作;结果是不均匀的,因为最外面的两个元素仍然不同。另一方面,如果两个内部元素相同,例如ABBC,那么它们必须与两个最外面的元素不同(否则我们在四个元素的集合中只有两个元素,而不是三个)。在这种情况下,执行第一个或第三个操作;这使得最后两个元素不同(例如,ABBC=CBC)或前两个元素不同(例如,ABBC=ABA),因此保留了非同质性。
最后,考虑第一个和最后一个元素相同的情况。然后我们遇到ABCA 这样的情况。中间的两个元素都必须与外部元素不同,否则在这种情况下我们只有两个元素,而不是三个。我们可以取第一个可用的操作,ABCA=CCA,再次保留非同质性。
证明结束。
我们有一个贪心算法来减少任何长度为 4 或更大的非齐次字符串:选择第一个保持非齐次的操作;这样的操作必须存在上述论点。
我们现在已经简化到我们有一个由 3 个元素组成的非同质字符串的情况。如果两个相同,我们要么有像AAB 这样的双精度,我们知道可以简化为单个元素,或者我们有两个没有双精度的元素,例如ABA=AC=B,也可以简化为单个元素,或者我们有三个不同的元素,比如ABC。共有六个排列,全部=1按关联性和交换性分组;所有这些都可以通过任何操作简化为两个元素;但是,由于问题中不允许使用1,因此它们不可能减少到同质对(AA、BB 或 CC)以下,所以我们知道这是我们在这种情况下可以做的最好的事情.
总而言之,如果一个字符串是齐次的,我们就无能为力了;如果一个字符串是非齐次的并且在组中=A,则可以通过贪心算法将其简化为问题中的A,该算法在每一步都保持非齐次;如果组中的字符串=B 或=C 相同;最后,如果一个字符串是非同质的并且在组中=1,它可以通过一个尽可能长时间保持非同质的贪心算法减少到AA、BB或CC之一。这些是我们可以通过操作的组属性来做的最好的事情。
解决问题的程序:
现在,既然我们知道了可能的结果,我们的程序可以在O(n) 时间运行如下:如果给定字符串中的所有字母都相同,则不可能减少,所以只输出字符串的长度。如果字符串是非齐次的,并且等于组中的标识,则输出数字2;否则输出数字 1。
为了快速判断一个元素是否等于组中的同一性,我们使用交换性和结合性如下:只需将A's、B's 和C's 的数量计入变量@ 987654414@、b、c。替换a = a mod 2、b = b mod 2、c = c mod 2,因为我们可以消除组中的AA、BB和CC对。如果生成的a、b、c 中没有一个等于 0,则我们在组中有 ABC=1,因此程序应该输出 2,因为不可能减少到标识 1。如果生成的a、b、c 的所有三个都等于 0,我们再次具有标识(A、B 和 C 都取消了自己)所以我们应该输出 2 . 否则字符串是非恒等式的,我们应该输出 1。