根据规则生成字符串的变体

时间:2013-12-26 20:09:08

标签: string algorithm

我希望得到的答案是:

我希望有人能告诉我解决这些类型问题的算法的一般类别。理想情况下,算法可以并行运行,但我仍然对只能按顺序执行的算法非常感兴趣。非常感谢具体的算法名称或参考文献:)

到目前为止我做了什么:

我基本上使用一些暴力方法来解决这个问题,包括生成给定字符串长度的所有排列,然后过滤掉与规则集不匹配的排列。我不喜欢这种方法,因为它显然很慢并且很快就受到我的计算能力(1台PC)和字符串大小的限制。我开始对这种方法进行很少的优化,但感觉我必须重新发明轮子,并且可能已经有一套算法来解决这些问题。

问题描述:

考虑如下字符串:

  

ABCDBEACBDECDBAACBE

我正在尝试找出有效的方法来生成符合一组规则/条件的字符串的所有排列。

规则示例:


简单示例:

  1. 与原始字符串
  2. 必须至少有2个不同之处
  3. 差异必须在字母集(A,B,C,D,E)
  4. 根据上述规则,单个有效排列的一个例子是:

    DE CDBEACBDECDBAACBE


    复杂的规则集示例1:

    1. 与原始字符串
    2. 必须至少有2个不同之处
    3. 差异必须在字母集(A,B,C,D,E)
    4. 新:差异必须出现在字符串
    5. 的已定义索引范围内
    6. 新:每个范围必须有2个差异
    7. 因此,给定原始字符串,假设我们定义了以下范围:

        

      [(0,4),(8,14)]

      这看起来像是:

        

      [ABCDB] EAC [BDECDBA] ACBE

      有效的排列示例是:

      BD CDBEACB AB CDBAACBE


      复杂的规则集示例2:

      1. 与原始字符串
      2. 必须至少有2个不同之处
      3. 差异必须在字母集(A,B,C,D,E)
      4. 差异必须出现在字符串
      5. 的已定义索引范围内
      6. 每个范围必须有2个差异
      7. 新:差异必须是特定的组合,让我们说“AB”
      8. 范围:

          

        [(0,4),(8,14)]

        有效的排列示例是:

        B AB DBEACB AB CDBAACBE


        复杂的规则集示例3:

        1. 与原始字符串
        2. 必须至少有2个不同之处
        3. 差异必须在字母集(A,B,C,D,E)
        4. 差异必须出现在字符串
        5. 的已定义索引范围内
        6. 每个范围必须有2个差异
        7. 新:范围可以重叠
        8. 范围:

            

          [(0,4),(3,7)]

          这看起来像是:

            

          [ABCD [B] EAC] BDECDBAACBE

          有效的排列示例是:

          ABC ADB ACBDECDBAACBE


1 个答案:

答案 0 :(得分:1)

建议的方法

我建议您阅读deterministic finite automaton

我试图模拟这类问题的方法是将问题转变为一个状态机,它能够根据一次一个字符来识别你想要的字符串。

拥有状态机之后,您可以使用动态编程来计算可以通过在特定状态下启动而生成的匹配字符串的数量。 (州知道到目前为止已经生成了多少个字符,以及每个规则的进度。)

使用此动态编程的结果,您可以在时间O(n)中生成匹配字符串的按字典顺序排列的第k个示例,其中n是字符串的长度。

但是,解决动态编程的成本会有很大差异,具体取决于规则集的复杂程度。

实施例

对于你的例子3:

There must be at least 2 differences from the original string
The differences must be in the alphabet set (A,B,C,D,E)
Differences must occur within defined index ranges of the string
Each range must have 2 differences

州政府需要包含以下信息:

Number of differences in first range (0,1,2)
Number of differences in second range (0,1,2)

因此总共有9个州要建模。

对于具有R范围的系统,每个系统都需要D差异,需要(D + 1)^ R个状态(如果范围不重叠则更少)。