我无法想出解决问题的想法,请告诉我你可以为下面的问题想出什么逻辑
输入是一个字符串,如果一个字符串的子字符串具有相同的长度,并且具有相同的字符集,则该字符串被认为是漂亮的。优美线条示例:011011011;101101101;1010; 1; 0000; 111 丑行:000101;10101;0001001 问题目的:打印可以纠正丑线的最少步骤数。
示例:000101 - 1 因为我们可以将第二个位置的 0 更改为 1 并得到 010101 0001001 - 2,所以我们可以将所有 1 替换为 0。
计算零和一,然后从较大的数字中减去较小的数字的想法是不合适的,因为在第一个示例中,4(零)减去2(单位)将得到答案2,但作为你可以看到,你可以一步纠正它。我以为它可以创建空白(比方说“漂亮”的空白,例如 11;00 等等),但事实上,有时你可以简单地将所有数字更改为相反的数字,结果就会更短。预先感谢您的回复。
令n为字符串s的长度。让我们检查一下它的所有真因数d : d|n, 1 ≤ d < n。
对于每个除数,我们计算字符串的更改次数,使其具有子字符串周期d。为此,我们将对周期k、0 ≤ k < d中的位置进行排序。
让我们考虑具有索引s k、 s d+k、 s 2d+k、 ...的符号。如果其中的零较多,那么将其替换为零更有利可图。如果是相反的情况,则将零替换为一。不管怎样,我们找到了使第k 个周期d数字变得漂亮的最小替换次数。为了让整个时期变得漂亮,你需要将所有等级的替换人数相加。
在线性时间内,计算到美丽周期d为止的替换次数。为了解决整个问题,需要找到所有时期的最小替换次数。解决方案的复杂度为O(nσ 0 (n)),其中σ 0是除数 的数量。
您可以使用线性搜索来搜索n 的约数。这本身并不是最有效的方法,但在这个问题的情况下,线性搜索以计算到美丽周期的距离为主。
ESkri在评论中建议“仅将字符串拆分为简单数量的子字符串”。考虑d 1 , d 2 : d 1 |d 2 |n。那么对于周期d 1来说是美丽的弦对于周期d 2来说也是美丽的。也就是说,在搜索最小替换次数时,不需要考虑周期d 1 :沿d 1 的最少替换次数不小于沿d 2的最少替换次数。
如果周期数m = d/n是合数,则可以展开为乘积m = m 1 m 2 , 1 < m 1 , m 2。那么dm 1是大于d的 n 的约数。因此,考虑周期的合数是没有意义的。
新算法:让我们检查n 的所有p - 素因数。对于每个p,我们计算d = n / p,并计算替换次数。对于所有p,我们选择最少的替换数。问题已经解决了。复杂度O(nω(n)),其中ω(n)是质因数n的数量。它的增长速度比σ 0 (n)慢(并且比log(n)慢),这在时间上带来了显着的增益。
请告诉我,上面Stanislav Volodarskiy提出的解决方案是否被“111000001”示例所破坏?
据我了解,它会给出 3,类似于:“101010101”。或者您可以分两步完成,替换最后两个 0:“111000111”