您将获得一个由1 <= n <= 32位组成的位字符串。
您还将获得一系列更改,这些更改会使某些位反转。如果原始字符串为001011,并且更改为“ 3”,则更改后的位字符串将为000011。(从右数第3位被翻转)
每次更改后,我必须找到每个位都相同的最长子字符串的长度。因此,对于000011,答案为4。
我认为暴力破解只是一个滑动窗口,它从字符串的大小开始并缩小直到窗口中所有位都相同的第一个实例。
对于动态编程解决方案,该如何更改?
答案 0 :(得分:0)
您可以通过维护一个翻转位的索引列表来解决此问题。首先创建该列表:将序列移动一位(最后丢失一位),然后与原始序列进行比较。这里的任何不匹配都有些翻转。列出这些索引:
001011
01011
-234--
在这种情况下,位置2、3和4之后会发生位翻转。
现在,您需要开发一个简单的功能来处理您的更改操作。这很简单:要更改位n
,您需要更改索引n-1
和n
是否在列表中:如果不在列表中,则添加它;否则,将它添加到列表中。如果在列表中,请将其删除。如果更改了位3,则两者都在列表中,因此您现在将其删除:
---4--
每次您要检查最长的子字符串时,只需要检查相邻索引中最大的不同即可。包括0和字符串长度作为端点。因此,当您拥有列表[0、2、3、4、6]时,在2-0和6-4处的最大差为2。更改后,使用列表[0,4,6],您在4-0处的最大差异为4。
如果您有一个包含许多索引的大型列表,则只需维护差异即可,仅更改受单个更改影响的相邻间隔。
这应该可以帮助您前进;我将实施细节留给学生。 :-)