反转字符串操作

时间:2011-05-16 19:57:20

标签: algorithm

当这个问题引起我的注意时,我正在摆弄我的加密算法:

假设您有一个由以下伪代码给出的字符串操作:

string go_wacky(string input, int reps)
{
    string result = input;
    foreach (0..reps)
    {
        result = insert_substring_at(result, input, random_from_to(0, length(result));
    }
    return result;
}

或者,在点击式术语中,复制字符串,然后重复次数执行以下操作:将光标移动到字符串中的随机位置并点击粘贴。

给定输出字符串和reps,如何提取输入字符串(基于使用rep和输出长度重建原始字符串的字符列表的“反向暴力”除外)?

4 个答案:

答案 0 :(得分:1)

我希望这不是太暴力,但我没有别的办法:

取输出的第一个字符(称之为a)和输出的最后一个字符(称之为b)。

在输出中搜索长度为len(输出)/ reps的子串,以a开头,以b结尾。这会产生一份候选人名单。

对于每个候选者,在输出中递归替换具有空字符串的候选者,即output = output.replace(candidate,'')

如果在最后一次替换后,结果是一个空字符串,则找到纯文本。

答案 1 :(得分:1)

我们可以通过计算所有字符的频率并除以rep count + 1来找到输入字符串的字符。例如,如果a在输出中是12次,并且rep count是2.那么输入字符串在输出中包含2+1次,因此包含12/3 = 4 a的。

接下来,查看输出的第一个char,也就是输入的第一个char。从频率中减去一个。

对于下一个字符,我们做分支。

  • 这是输入的开始:继续。
  • ,它是输入的第二个字符。降低频率并继续。

以下字符的程序几乎相同。

例如,如果输出以aa...开头。在阅读第二个a时,输入可以是a...aa...。 (除非a的频率为1。)

我认为这应该很快。在频率都是1的情况下,这是具有n个输出字符串大小的O(n)。

答案 2 :(得分:0)

只是一些随意的想法:

答案 3 :(得分:0)

输出长度= N重复*输入字符串的大小。

如果没有关于输入字符串大小或重复次数的更好线索,则无法保证这是可解决的。