String 查找可以派生字符串的不同路径数

String 查找可以派生字符串的不同路径数,string,algorithm,dynamic-programming,String,Algorithm,Dynamic Programming,存在一条长度至少为2且仅包含字符a..Z的秘密消息 对其应用一系列“操作”。示例中显示了一个操作 给定最终的加密字符串,计算使用应用于源字符串的一个或多个重复操作生成此字符串的可能方式的数量。操作是不同的,即使它们对您的秘密消息进行相同的加密。即:从AA获得AAA有四种不同的方式 以下是一个例子: 加密字符串为:ABABA。输出为:8。以下是您制作ABABA的不同方式: 从AB->AB+A->AB+ABA开始 从AB->AB+A->ABA+BA开始 3.从ABA->AB+ABA开始 从ABA->

存在一条长度至少为2且仅包含字符a..Z的秘密消息

对其应用一系列“操作”。示例中显示了一个操作

给定最终的加密字符串,计算使用应用于源字符串的一个或多个重复操作生成此字符串的可能方式的数量。操作是不同的,即使它们对您的秘密消息进行相同的加密。即:从AA获得AAA有四种不同的方式

以下是一个例子:

加密字符串为:ABABA。输出为:8。以下是您制作ABABA的不同方式:

  • 从AB->AB+A->AB+ABA开始
  • 从AB->AB+A->ABA+BA开始 3.从ABA->AB+ABA开始
  • 从ABA->ABA+BA开始
  • 从BA->A+BA->AB+ABA开始
  • 从BA->A+BA->ABA+BA开始
  • 从ABAB->ABAB+A开始
  • 从爸爸开始->爸爸+爸爸

  • 你能帮我推荐一个算法来解决这个问题吗。我曾想过尝试递归,但在较大的输入上,我的代码运行速度很慢。

    请注意,在派生的每一步中,您都会得到一个“加密”字符串的子字符串。有很多这样的子串(即O(n^2))是二次的

    您可以找到多种方法直接从每个后缀和前缀派生最终字符串

    所以,你有很多可能的二次子问题,你可以把一个问题分解成一整套子问题,对每个子问题进行计数,然后把结果加起来


    通过只解一次每个子问题,就可以得到一个动态规划算法。此动态编程算法可以在立方时间内运行。

    不确定这是否正确,但下面是JavaScript中的递归尝试:

    function f(str){
        var total = 0
    
        function g(ptr,len){
            for (var i=1; i<= (len%2 == 0 ? len/2 - 1: (len - 1)/2); i++){
                var left = str.substr(ptr,len - i),
                    suffix = str.substr(ptr + len - i,i),
                    right = str.substr(ptr + i,len - i),
                    prefix = str.substr(ptr,i),
                    recurseL = false,
                    recurseR = false
    
                if (suffix == left.substr(-i)){
                    total++
                    recurseL = true
                }
                if (suffix == left.substr(0,i)){
                    total++
                    recurseL = true
                }
                if (prefix == right.substr(-i)){
                    total++
                    recurseR = true
                }
                if (prefix == right.substr(0,i)){
                    total++
                    recurseR = true
                }
    
                if (recurseR)
                    g(ptr + i,len - i)
                if (recurseL)
                    g(ptr,len - i)
            }
            return total
        }
    
        return g(0,str.length)
    }
    
    f("ABABA")
    

    闻起来像是动态规划。请注意,在每一步中,字符串都会变大,因此递归地向后工作总是会终止。然而,我在动态规划方面没有太多的实践,因此不知道如何解决这个问题。你能举一个“大输入”的例子,它对你来说可能运行得太慢吗?对不起,但我不认为我完全理解解决方案。如果可能的话,你能给我一个伪代码或者只是一个例子来说明它是如何工作的吗?再次抱歉,我正在尝试学习动态编程,但仍在努力。@user3188300:你在哪里迷路了?我不知道如何分解字符串,然后从后缀和前缀中获取方法数。分解字符串的方法有很多种;取每个前缀和后缀,看看是否可以一步从那里得到所需的字符串。然后将该数字乘以获得该前缀/后缀的方法数。
    8