【发布时间】:2023-03-25 18:55:01
【问题描述】:
在删除两个字符后,我需要获取一些唯一的字符串。算法还应该提供打印这些新词的可能性。输入字符串仅由 'a' 到 'z' ASCII 字符组成。
例如,对于输入字符串“pizza”,我们有 7 个字符串:“zza”、“iza”、“izz”、“pza”、“pzz”、“pia”、“piz”。
我的首要任务是算法的高效性。
我放弃了设置容器的想法,以避免由于巨大的内存复杂性而重复(对于 2400 个字符的输入字符串,我填充了整个 RAM 并交换)。这个解决方案似乎也没有那么快。
所以我决定设计更智能的算法,类似于 RLE 压缩,所以我将“pizza”显示为块:1xP、1xI、2xZ、1xA。现在我们可以看到,对于第一个删除字符,它只与我从哪个块中删除字符有关(我们删除了哪个“z”无关紧要)。因此,在第一阶段,我们从例如第一个块中删除一个字符。在第二阶段,我们从仍然存在的块中删除第二个字符。 (我们在每个案例中循环重复过程)。
问题是这个解决方案可以很好地删除一个字符。但是对于两个字符,它可能会产生重复。例如输入“aba”,我们有块 1xA、1xB、1xA:我们从第一个块中删除一个字符,得到 1xB、1xA。接下来,我们从第一个现有块 (1xB) 中删除下一个字符,我们得到 1xA。下一个算法进入原始输入字符串的下一个块(1xB)并删除属于该块的一个字符,我们得到 2xA。接下来我们从现有块中删除第二个字符(我们只有一个块),我们得到 1xA。这里我们有重复。
一般而言,算法会因“abababababa...”这样的词而失败(当我们删除第一个“ab”或任何其他相邻词时,我们会得到相同的情况。
我需要建议如何巧妙地处理这种重复。也许你对算法有完全不同的想法。
【问题讨论】:
-
您可以获得
O(n²)时间和O(n)空间算法,其中嵌入了两个for循环来选择要删除的两个字符。 -
我知道,但是如何处理我提到的这些重复项?
-
您可以从this 问题中获得灵感。
-
你能发布你的代码吗?我本来希望您的原始解决方案(带有集合容器)能够正常工作,并且只需要几十兆字节的 RAM。
-
我弄错了,输入字符串的长度应该等于2400而不是400。但这没关系,因为我无法将所有可能性都存储在内存中。