【问题标题】:SpecialStrings prob from topcoder srm 634 div 2来自 topcoder srm 634 div 2 的 SpecialStrings 概率
【发布时间】:2014-09-30 23:15:37
【问题描述】:

我的 python 似乎在输入字符串的长度不大的情况下工作,但它在相当长的字符串下失败了。这是问题陈述:

如果字符串 S 满足以下两个属性,则称其为特殊字符串: S 中的每个字符都是“0”或“1”。 每当 S = UV 且 U 和 V 都是非空字符串时,U 按字典顺序严格小于 V。 例如,字符串 S = "00101" 是特殊的,因为我们有 "0"

这是我的python代码:

class SpecialStrings(object):
    def findNext(self, current):
        if current == '0':
            return '1'
        N = len(current)
        iter_times = 2 ** N - int(current, 2) - 1
        temp_current = current
        for i in range(iter_times):
            temp_s = self.get_next_string(temp_current)
            if self.is_special(temp_s):
                return temp_s
            if temp_s[0] == '1':
                return ''
            temp_current = temp_s
        return ''

    def get_next_string(self, s):
        next_string = bin(int(s, 2) + 1)
        next_string = next_string[2:]
        if len(next_string) < len(s):
            temp_zero = '0' * (len(s) - len(next_string))
            next_string = temp_zero + next_string
        return next_string

    def is_special(self, s):
        for i in range(1, len(s)):
            left = s[:i]
            right = s[i:]
            if left >= right:
                return False
        return True

我收到输入“0111111111111111111111111111”和“001111111111111111111111111111111111111111”的异常终止。当我尝试使用其中任何一个进行本地测试时,我的计算机内存已耗尽......

这里有什么问题?是不是因为我的算法效率不高?如何解决?

非常感谢!!!!!!

【问题讨论】:

标签: python string algorithm


【解决方案1】:

您可能正在使用 Python2。在 Py2 中,range()(您的第 8 行)返回一个列表。例如。 range(3) 返回 [0, 1, 2]。所以range(iter_times) 创建了一个用完内存的大列表。简单的解决方法:改用xrangeRefer


但是使用xrange,您可能很快就会收到另一个错误:

OverflowError: Python int 太大而无法转换为 C long

因为传递给 xrange 的参数不应超过 max signed long。例如。在我的机器上xrange(0x7fffffff) 可以,而xrange(0x80000000) 可以触发错误。 Refer

解决方法:在第 8 行中,改用 while True:。因为如果代码按预期工作,循环应该在到达 for 循环结束之前返回结果或空字符串。所以不需要使用 for 循环。


下一个麻烦,当你使用'while True'时,输入'0111111111111111111111111111'应该可以正常工作,但'001111111111111111111111111111111111111111'会继续计算。这就是算法问题。您使用了蛮力,大量输入预计需要较长的计算时间。您可能需要找到特殊字符串的模式来改进算法。

【讨论】:

  • 一开始也考虑过xrange,但是topcoder系统测试还是异常终止,本地测试时内存不足。我尝试了 While True ,但它需要大约 10 分钟才能得到结果,因为它遍历了 while 列表。我认为这里的蛮力是不现实的。你对算法有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2018-04-26
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多