猜猜给定随机三元组的字符串

时间:2014-07-14 23:22:48

标签: algorithm

给定一个未知字符串,执行一个名为

的效用函数
string returnRandomTripletFromString(string)

该函数从未知字符串返回一个随机三元组,您还可以获得字符串的长度

实用函数返回的随机三元组将保持字符串中字母的相对顺序,

让我们说这个字符串是helloworld 它会返回

' hel',' wod',' lor'

但它永远不会返回

' LHD'

因为h在字符串

中位于l之前

如何使用此实用程序函数猜测字符串,使用该函数的最小调用次数。

5 个答案:

答案 0 :(得分:11)

在调用随机三元组函数多次次之后会发生这种情况。

  

假设我们的字符串是“你好”

让调用随机三元组函数在每次调用时给出以下内容,但不一定按此顺序:

  

ell   你好   hel
  你好   elo

如果我从随机三元组函数中获得的字符创建图形:

enter image description here

从这张图中,我只能解释起始字母可能是

  

'H'

和结束信可能是

  

'O'

     

然后,如果我在图中找到最长的路径。根据我从哪里开始,我会得到“你好”或“olleh”。

此外,路径中访问的节点数将等于字符串的长度。

假设:

  1. 我只能在调用随机三元组函数后创建此图形 多次。
  2. 每次我从随机函数中获取独特的三元组来构建图形

答案 1 :(得分:1)

我正在治疗' bok'在你的例子中不允许。

一般来说,这可能非常困难,假设目标字符串是" 10101010" 他们所有可能的子串都是可能的,如果知道选择三元组的随机函数有什么偏差,则可以使用统计分析来解卷积产生原始的分布

一种方法cpuld 1确定哪些字符组成字符串, 2尝试这些字符的不同组合,直到找到产生类似结果分布的字符。

控制每个结果的比例的统计规则是一个线性方程组,因此可以尝试同时求解这些方程

答案 2 :(得分:0)

我没有看到通过获取那些随机的"三胞胎"来找到原始字符串的任何可能方法。因为没有办法找到字符串的长度。但是,如果已知字符串的长度,则可以通过对函数执行连续调用然后对其输出进行高级比较来解决问题。但这也很复杂,恕我直言。 编辑:仍然不可能,恕我直言,即使字符串长度已知。如果我们保证字符串中没有重复字符,那么只有100%可能。否则,请考虑一个带有重复字母和字母图案的非常长的字符串。使用来自那些"三胞胎"的信息,恕我直言,不可能重建这样的字符串。

答案 3 :(得分:0)

我认为你有一份所有可能的字符串列表?

我会尝试通过搜索包含哪些字符串来减少列表  第一个字母。如果项目确实包含该字符,则保存  与字符串关联的字符的索引。如果是一个项目  不包含该字符,然后将其从列表中删除。

循环遍历三元组中的其他字符,在找到最后一个字符的索引后找到每个字符的第一个实例(如果不包含则删除)

完成三元组的循环后,如果仍有多个选项,则获取一个新的三元组,直到所有其他剩余选项都被消除。

#注意:弥补被搜索的字符串只有3个字母/一个由多个其他字符串匹配的模式的情况。然后,您可以分析每个字母的出现次数,并将其与字符串中的预测事件进行比较。您可以通过关注每个字母的相对出现来使其更准确

答案 4 :(得分:0)

def getstring(triplets):
    r = list(set([i for l in triplets for i in l]))
    for l in triplets:
        fix(r, l[1], l[2])
        fix(r, l[0], l[1])
    return ''.join(r)

def fix(l, a, b):
    if l.index(a) > l.index(b):
        l.remove(a)
        l.insert(l.index(b), a)

如果没有字符重复,这是代码,就像Mints97指出的那样非常简单。