具有区间调度的回文分区

时间:2017-05-14 09:53:55

标签: algorithm scheduling intervals partitioning palindrome

所以我正在研究解决Palindrome分区问题的各种算法。 喜欢字符串" banana"最小的切割次数,使每个子串是回文是1,即" b | anana"

现在我尝试使用区间调度来解决这个问题,如:

Input: banana
Transformed string:  # b # a # n # a # n # a #  
P[] = lengths of palindromes considering each character as center of  palindrome.
I[] = intervals

String: # b # a # n # a # n #  a  #
P[i]:   0 1 0 1 0 3 0 5 0 3 0  1  0
I[i]:   0 1 2 3 4 5 6 7 8 9 10 11 12
  

示例:Palindrome考虑' a' (指数7)作为中心是5" anana"

现在根据P [i]构建每个字符的间隔:

b = (0,2)
a = (2,4)
n = (2,8)
a = (2,12)
n = (6,12)
a = (10,12)
  

所以,现在如果我必须在时间0到12上安排这些多个间隔,以便应该安排最小的间隔时间并且没有时隙保持为空,我会选择(0,2)和(2,12)间隔因此,解决方案的答案是 1 ,因为我在两个回文中分解了给定的字符串。

另一个测试案例:

String: # E # A # B # A # E #  A  #  B  # 
P[i]:   0 1 0 1 0 5 0 1 0 5 0  1  0  1  0
I[i]:   0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

绘制图表: enter image description here

  

现在,可以安排的最小间隔时间是:       1(0,2),2(2,4),5(4,14)OR       3(0,10),6(10,12),7(12,14)

因此,我们有3个分区,因此切割次数为2

E|A|BAEAB 
EABAE|A|B

这些只是一些例子。我想知道这个算法是否适用于所有情况,或者在某些情况下肯定会失败。

  

请帮我证明它可以在每种情况下都有效。

     

注意:如果这篇文章没有任何意义,请不要劝阻我,因为我已经花了足够的时间和精力解决这个问题,只是说出一个理由或提供一些链接,我可以从这里继续解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:2)

只要你能得到字符串的分区,你的算法就可以了。

请注意,集P的分区S是一组非空子集A1, ..., An

  • 每组A1, ... An的联合都会给出S
  • 任何Ai, Aj(与i != j)之间的交集为空

即使回文分区处理字符串(与集合稍有不同),分区的属性仍然是正确的。 因此,如果你有一个分区,那么你有一组时间间隔没有"空洞"安排。 选择具有最小子集数的分区,可以使您拥有最小的时间间隔数,从而获得最小数量的切割。

此外,你总是至少有一个字符串的回文分区:在最坏的情况下,你得到一个由单个字符组成的回文分区。

相关问题